docagent-cli 0.0.35__py3-none-any.whl
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.
- docagent_cli/__init__.py +36 -0
- docagent_cli/__main__.py +6 -0
- docagent_cli/_ask_user_types.py +90 -0
- docagent_cli/_cli_context.py +27 -0
- docagent_cli/_debug.py +52 -0
- docagent_cli/_env_vars.py +56 -0
- docagent_cli/_server_config.py +352 -0
- docagent_cli/_session_stats.py +114 -0
- docagent_cli/_testing_models.py +144 -0
- docagent_cli/_version.py +17 -0
- docagent_cli/agent.py +1193 -0
- docagent_cli/app.py +4979 -0
- docagent_cli/app.tcss +283 -0
- docagent_cli/ask_user.py +301 -0
- docagent_cli/built_in_skills/__init__.py +5 -0
- docagent_cli/built_in_skills/doc-coauthoring/SKILL.md +375 -0
- docagent_cli/built_in_skills/docx/LICENSE.txt +30 -0
- docagent_cli/built_in_skills/docx/SKILL.md +590 -0
- docagent_cli/built_in_skills/docx/scripts/__init__.py +1 -0
- docagent_cli/built_in_skills/docx/scripts/accept_changes.py +135 -0
- docagent_cli/built_in_skills/docx/scripts/comment.py +318 -0
- docagent_cli/built_in_skills/docx/scripts/office/helpers/__init__.py +0 -0
- docagent_cli/built_in_skills/docx/scripts/office/helpers/merge_runs.py +199 -0
- docagent_cli/built_in_skills/docx/scripts/office/helpers/simplify_redlines.py +197 -0
- docagent_cli/built_in_skills/docx/scripts/office/pack.py +159 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/mce/mc.xsd +75 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- docagent_cli/built_in_skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- docagent_cli/built_in_skills/docx/scripts/office/soffice.py +183 -0
- docagent_cli/built_in_skills/docx/scripts/office/unpack.py +132 -0
- docagent_cli/built_in_skills/docx/scripts/office/validate.py +111 -0
- docagent_cli/built_in_skills/docx/scripts/office/validators/__init__.py +15 -0
- docagent_cli/built_in_skills/docx/scripts/office/validators/base.py +847 -0
- docagent_cli/built_in_skills/docx/scripts/office/validators/docx.py +446 -0
- docagent_cli/built_in_skills/docx/scripts/office/validators/pptx.py +275 -0
- docagent_cli/built_in_skills/docx/scripts/office/validators/redlining.py +247 -0
- docagent_cli/built_in_skills/docx/scripts/templates/comments.xml +3 -0
- docagent_cli/built_in_skills/docx/scripts/templates/commentsExtended.xml +3 -0
- docagent_cli/built_in_skills/docx/scripts/templates/commentsExtensible.xml +3 -0
- docagent_cli/built_in_skills/docx/scripts/templates/commentsIds.xml +3 -0
- docagent_cli/built_in_skills/docx/scripts/templates/people.xml +3 -0
- docagent_cli/built_in_skills/pdf/LICENSE.txt +30 -0
- docagent_cli/built_in_skills/pdf/SKILL.md +314 -0
- docagent_cli/built_in_skills/pdf/forms.md +294 -0
- docagent_cli/built_in_skills/pdf/reference.md +612 -0
- docagent_cli/built_in_skills/pdf/scripts/check_bounding_boxes.py +65 -0
- docagent_cli/built_in_skills/pdf/scripts/check_fillable_fields.py +11 -0
- docagent_cli/built_in_skills/pdf/scripts/convert_pdf_to_images.py +33 -0
- docagent_cli/built_in_skills/pdf/scripts/create_validation_image.py +37 -0
- docagent_cli/built_in_skills/pdf/scripts/extract_form_field_info.py +122 -0
- docagent_cli/built_in_skills/pdf/scripts/extract_form_structure.py +115 -0
- docagent_cli/built_in_skills/pdf/scripts/fill_fillable_fields.py +98 -0
- docagent_cli/built_in_skills/pdf/scripts/fill_pdf_form_with_annotations.py +107 -0
- docagent_cli/built_in_skills/pptx/LICENSE.txt +30 -0
- docagent_cli/built_in_skills/pptx/SKILL.md +232 -0
- docagent_cli/built_in_skills/pptx/editing.md +205 -0
- docagent_cli/built_in_skills/pptx/pptxgenjs.md +420 -0
- docagent_cli/built_in_skills/pptx/scripts/__init__.py +0 -0
- docagent_cli/built_in_skills/pptx/scripts/add_slide.py +195 -0
- docagent_cli/built_in_skills/pptx/scripts/clean.py +286 -0
- docagent_cli/built_in_skills/pptx/scripts/office/helpers/__init__.py +0 -0
- docagent_cli/built_in_skills/pptx/scripts/office/helpers/merge_runs.py +199 -0
- docagent_cli/built_in_skills/pptx/scripts/office/helpers/simplify_redlines.py +197 -0
- docagent_cli/built_in_skills/pptx/scripts/office/pack.py +159 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/mce/mc.xsd +75 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- docagent_cli/built_in_skills/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- docagent_cli/built_in_skills/pptx/scripts/office/soffice.py +183 -0
- docagent_cli/built_in_skills/pptx/scripts/office/unpack.py +132 -0
- docagent_cli/built_in_skills/pptx/scripts/office/validate.py +111 -0
- docagent_cli/built_in_skills/pptx/scripts/office/validators/__init__.py +15 -0
- docagent_cli/built_in_skills/pptx/scripts/office/validators/base.py +847 -0
- docagent_cli/built_in_skills/pptx/scripts/office/validators/docx.py +446 -0
- docagent_cli/built_in_skills/pptx/scripts/office/validators/pptx.py +275 -0
- docagent_cli/built_in_skills/pptx/scripts/office/validators/redlining.py +247 -0
- docagent_cli/built_in_skills/pptx/scripts/thumbnail.py +289 -0
- docagent_cli/built_in_skills/remember/SKILL.md +118 -0
- docagent_cli/built_in_skills/skill-creator/LICENSE.txt +202 -0
- docagent_cli/built_in_skills/skill-creator/SKILL.md +485 -0
- docagent_cli/built_in_skills/skill-creator/agents/analyzer.md +274 -0
- docagent_cli/built_in_skills/skill-creator/agents/comparator.md +202 -0
- docagent_cli/built_in_skills/skill-creator/agents/grader.md +223 -0
- docagent_cli/built_in_skills/skill-creator/assets/eval_review.html +146 -0
- docagent_cli/built_in_skills/skill-creator/eval-viewer/generate_review.py +471 -0
- docagent_cli/built_in_skills/skill-creator/eval-viewer/viewer.html +1325 -0
- docagent_cli/built_in_skills/skill-creator/references/schemas.md +430 -0
- docagent_cli/built_in_skills/skill-creator/scripts/__init__.py +0 -0
- docagent_cli/built_in_skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- docagent_cli/built_in_skills/skill-creator/scripts/generate_report.py +326 -0
- docagent_cli/built_in_skills/skill-creator/scripts/improve_description.py +247 -0
- docagent_cli/built_in_skills/skill-creator/scripts/package_skill.py +136 -0
- docagent_cli/built_in_skills/skill-creator/scripts/quick_validate.py +103 -0
- docagent_cli/built_in_skills/skill-creator/scripts/run_eval.py +310 -0
- docagent_cli/built_in_skills/skill-creator/scripts/run_loop.py +328 -0
- docagent_cli/built_in_skills/skill-creator/scripts/utils.py +47 -0
- docagent_cli/built_in_skills/theme-factory/LICENSE.txt +202 -0
- docagent_cli/built_in_skills/theme-factory/SKILL.md +59 -0
- docagent_cli/built_in_skills/theme-factory/theme-showcase.pdf +0 -0
- docagent_cli/built_in_skills/theme-factory/themes/arctic-frost.md +19 -0
- docagent_cli/built_in_skills/theme-factory/themes/botanical-garden.md +19 -0
- docagent_cli/built_in_skills/theme-factory/themes/desert-rose.md +19 -0
- docagent_cli/built_in_skills/theme-factory/themes/forest-canopy.md +19 -0
- docagent_cli/built_in_skills/theme-factory/themes/golden-hour.md +19 -0
- docagent_cli/built_in_skills/theme-factory/themes/midnight-galaxy.md +19 -0
- docagent_cli/built_in_skills/theme-factory/themes/modern-minimalist.md +19 -0
- docagent_cli/built_in_skills/theme-factory/themes/ocean-depths.md +19 -0
- docagent_cli/built_in_skills/theme-factory/themes/sunset-boulevard.md +19 -0
- docagent_cli/built_in_skills/theme-factory/themes/tech-innovation.md +19 -0
- docagent_cli/built_in_skills/xlsx/LICENSE.txt +30 -0
- docagent_cli/built_in_skills/xlsx/SKILL.md +292 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/helpers/__init__.py +0 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/helpers/merge_runs.py +199 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/helpers/simplify_redlines.py +197 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/pack.py +159 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/mce/mc.xsd +75 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/soffice.py +183 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/unpack.py +132 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/validate.py +111 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/validators/__init__.py +15 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/validators/base.py +847 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/validators/docx.py +446 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/validators/pptx.py +275 -0
- docagent_cli/built_in_skills/xlsx/scripts/office/validators/redlining.py +247 -0
- docagent_cli/built_in_skills/xlsx/scripts/recalc.py +184 -0
- docagent_cli/clipboard.py +128 -0
- docagent_cli/command_registry.py +284 -0
- docagent_cli/config.py +2418 -0
- docagent_cli/configurable_model.py +162 -0
- docagent_cli/default_agent_prompt.md +12 -0
- docagent_cli/editor.py +142 -0
- docagent_cli/file_ops.py +473 -0
- docagent_cli/formatting.py +28 -0
- docagent_cli/hooks.py +206 -0
- docagent_cli/input.py +787 -0
- docagent_cli/integrations/__init__.py +1 -0
- docagent_cli/integrations/sandbox_factory.py +873 -0
- docagent_cli/integrations/sandbox_provider.py +71 -0
- docagent_cli/local_context.py +718 -0
- docagent_cli/main.py +1641 -0
- docagent_cli/mcp_tools.py +707 -0
- docagent_cli/mcp_trust.py +168 -0
- docagent_cli/media_utils.py +478 -0
- docagent_cli/model_config.py +1620 -0
- docagent_cli/non_interactive.py +948 -0
- docagent_cli/offload.py +371 -0
- docagent_cli/output.py +69 -0
- docagent_cli/project_utils.py +188 -0
- docagent_cli/py.typed +0 -0
- docagent_cli/remote_client.py +515 -0
- docagent_cli/server.py +520 -0
- docagent_cli/server_graph.py +196 -0
- docagent_cli/server_manager.py +365 -0
- docagent_cli/sessions.py +1262 -0
- docagent_cli/skills/__init__.py +18 -0
- docagent_cli/skills/commands.py +1090 -0
- docagent_cli/skills/load.py +192 -0
- docagent_cli/subagents.py +173 -0
- docagent_cli/system_prompt.md +247 -0
- docagent_cli/textual_adapter.py +1352 -0
- docagent_cli/theme.py +842 -0
- docagent_cli/token_state.py +31 -0
- docagent_cli/tool_display.py +298 -0
- docagent_cli/tools.py +236 -0
- docagent_cli/ui.py +420 -0
- docagent_cli/unicode_security.py +516 -0
- docagent_cli/update_check.py +454 -0
- docagent_cli/widgets/__init__.py +9 -0
- docagent_cli/widgets/_links.py +63 -0
- docagent_cli/widgets/approval.py +442 -0
- docagent_cli/widgets/ask_user.py +398 -0
- docagent_cli/widgets/autocomplete.py +691 -0
- docagent_cli/widgets/chat_input.py +1827 -0
- docagent_cli/widgets/diff.py +248 -0
- docagent_cli/widgets/history.py +188 -0
- docagent_cli/widgets/loading.py +177 -0
- docagent_cli/widgets/mcp_viewer.py +362 -0
- docagent_cli/widgets/message_store.py +675 -0
- docagent_cli/widgets/messages.py +1751 -0
- docagent_cli/widgets/model_selector.py +964 -0
- docagent_cli/widgets/status.py +372 -0
- docagent_cli/widgets/theme_selector.py +164 -0
- docagent_cli/widgets/thread_selector.py +1905 -0
- docagent_cli/widgets/tool_renderers.py +148 -0
- docagent_cli/widgets/tool_widgets.py +274 -0
- docagent_cli/widgets/welcome.py +339 -0
- docagent_cli-0.0.35.data/data/docagent_cli/default_agent_prompt.md +12 -0
- docagent_cli-0.0.35.dist-info/METADATA +200 -0
- docagent_cli-0.0.35.dist-info/RECORD +300 -0
- docagent_cli-0.0.35.dist-info/WHEEL +4 -0
- docagent_cli-0.0.35.dist-info/entry_points.txt +3 -0
|
@@ -0,0 +1,515 @@
|
|
|
1
|
+
"""Remote agent client — thin wrapper around LangGraph's `RemoteGraph`.
|
|
2
|
+
|
|
3
|
+
Delegates streaming, state management, and SSE handling to
|
|
4
|
+
`langgraph.pregel.remote.RemoteGraph`. The only added logic is converting raw
|
|
5
|
+
message dicts from the server into LangChain message objects that the CLI's
|
|
6
|
+
Textual adapter expects.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import logging
|
|
12
|
+
from typing import TYPE_CHECKING, Any
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from collections.abc import AsyncIterator, Callable
|
|
16
|
+
|
|
17
|
+
from docagent_cli._debug import configure_debug_logging
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
configure_debug_logging(logger)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _require_thread_id(config: dict[str, Any] | None) -> str:
|
|
24
|
+
"""Extract and validate that `thread_id` is present in config.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
config: Config dict with `configurable.thread_id`.
|
|
28
|
+
|
|
29
|
+
Returns:
|
|
30
|
+
The thread ID string.
|
|
31
|
+
|
|
32
|
+
Raises:
|
|
33
|
+
ValueError: If `thread_id` is missing.
|
|
34
|
+
"""
|
|
35
|
+
thread_id = (config or {}).get("configurable", {}).get("thread_id")
|
|
36
|
+
if not thread_id:
|
|
37
|
+
msg = "thread_id is required in config.configurable"
|
|
38
|
+
raise ValueError(msg)
|
|
39
|
+
return thread_id
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class RemoteAgent:
|
|
43
|
+
"""Client that talks to a LangGraph server over HTTP+SSE.
|
|
44
|
+
|
|
45
|
+
Wraps `langgraph.pregel.remote.RemoteGraph` which handles SSE parsing,
|
|
46
|
+
stream-mode negotiation (`messages-tuple`), namespace extraction, and
|
|
47
|
+
interrupt detection. This class adds only message-object conversion for the
|
|
48
|
+
Textual adapter and thread-ID normalization.
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
def __init__(
|
|
52
|
+
self,
|
|
53
|
+
url: str,
|
|
54
|
+
*,
|
|
55
|
+
graph_name: str = "agent",
|
|
56
|
+
api_key: str | None = None,
|
|
57
|
+
headers: dict[str, str] | None = None,
|
|
58
|
+
) -> None:
|
|
59
|
+
"""Initialize the remote agent client.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
url: Base URL of the LangGraph server.
|
|
63
|
+
graph_name: Name of the graph on the server.
|
|
64
|
+
api_key: API key for authenticated deployments.
|
|
65
|
+
|
|
66
|
+
When `None`, `RemoteGraph` auto-reads `LANGGRAPH_API_KEY`,
|
|
67
|
+
`LANGSMITH_API_KEY`, or `LANGCHAIN_API_KEY` from
|
|
68
|
+
the environment.
|
|
69
|
+
headers: Extra HTTP headers to include in every request
|
|
70
|
+
(e.g. bearer tokens, proxy headers).
|
|
71
|
+
"""
|
|
72
|
+
self._url = url
|
|
73
|
+
self._graph_name = graph_name
|
|
74
|
+
self._api_key = api_key
|
|
75
|
+
self._headers = headers
|
|
76
|
+
self._graph: Any = None
|
|
77
|
+
|
|
78
|
+
def _get_graph(self) -> Any: # noqa: ANN401
|
|
79
|
+
"""Lazily create the `RemoteGraph` instance.
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
A `RemoteGraph` connected to the server.
|
|
83
|
+
"""
|
|
84
|
+
if self._graph is None:
|
|
85
|
+
from langgraph.pregel.remote import RemoteGraph
|
|
86
|
+
|
|
87
|
+
self._graph = RemoteGraph(
|
|
88
|
+
self._graph_name,
|
|
89
|
+
url=self._url,
|
|
90
|
+
api_key=self._api_key,
|
|
91
|
+
headers=self._headers,
|
|
92
|
+
)
|
|
93
|
+
return self._graph
|
|
94
|
+
|
|
95
|
+
async def astream(
|
|
96
|
+
self,
|
|
97
|
+
input: dict | Any, # noqa: A002, ANN401
|
|
98
|
+
*,
|
|
99
|
+
stream_mode: list[str] | None = None,
|
|
100
|
+
subgraphs: bool = False,
|
|
101
|
+
config: dict[str, Any] | None = None,
|
|
102
|
+
context: Any | None = None, # noqa: ANN401
|
|
103
|
+
durability: str | None = None, # noqa: ARG002
|
|
104
|
+
) -> AsyncIterator[tuple[tuple[str, ...], str, Any]]:
|
|
105
|
+
"""Stream agent execution, yielding tuples matching Pregel's format.
|
|
106
|
+
|
|
107
|
+
Delegates to `RemoteGraph.astream` (which handles `messages-tuple`
|
|
108
|
+
negotiation, SSE routing, and namespace parsing) and converts the raw
|
|
109
|
+
message dicts into LangChain message objects for the adapter.
|
|
110
|
+
|
|
111
|
+
Args:
|
|
112
|
+
input: The input to send (messages dict or Command).
|
|
113
|
+
stream_mode: Stream modes to request.
|
|
114
|
+
subgraphs: Whether to stream subgraph events.
|
|
115
|
+
config: LangGraph config with `configurable.thread_id`, etc.
|
|
116
|
+
context: Runtime context (e.g. `CLIContext`) forwarded to the
|
|
117
|
+
server via the SDK's `context=` parameter.
|
|
118
|
+
durability: Ignored (server manages durability).
|
|
119
|
+
|
|
120
|
+
Yields:
|
|
121
|
+
3-tuples of `(namespace, stream_mode, data)`.
|
|
122
|
+
|
|
123
|
+
Raises:
|
|
124
|
+
ValueError: If `thread_id` is not present in `config`.
|
|
125
|
+
""" # noqa: DOC502 — raised by _require_thread_id
|
|
126
|
+
from langchain_core.messages import BaseMessage
|
|
127
|
+
|
|
128
|
+
_require_thread_id(config)
|
|
129
|
+
|
|
130
|
+
graph = self._get_graph()
|
|
131
|
+
config = _prepare_config(config)
|
|
132
|
+
dropped_count = 0
|
|
133
|
+
|
|
134
|
+
async for ns, mode, data in graph.astream(
|
|
135
|
+
input,
|
|
136
|
+
stream_mode=stream_mode or ["messages", "updates"],
|
|
137
|
+
subgraphs=subgraphs,
|
|
138
|
+
config=config,
|
|
139
|
+
context=context,
|
|
140
|
+
):
|
|
141
|
+
logger.debug("RemoteGraph event mode=%s ns=%s", mode, ns)
|
|
142
|
+
|
|
143
|
+
if mode == "messages":
|
|
144
|
+
msg_dict, meta = data
|
|
145
|
+
if isinstance(msg_dict, dict):
|
|
146
|
+
msg_obj = _convert_message_data(msg_dict)
|
|
147
|
+
if msg_obj is not None:
|
|
148
|
+
yield (ns, "messages", (msg_obj, meta or {}))
|
|
149
|
+
else:
|
|
150
|
+
dropped_count += 1
|
|
151
|
+
elif isinstance(msg_dict, BaseMessage):
|
|
152
|
+
# Already a LangChain message object (pre-deserialized)
|
|
153
|
+
yield (ns, "messages", (msg_dict, meta or {}))
|
|
154
|
+
else:
|
|
155
|
+
logger.warning(
|
|
156
|
+
"Unexpected message data type in stream: %s",
|
|
157
|
+
type(msg_dict).__name__,
|
|
158
|
+
)
|
|
159
|
+
continue
|
|
160
|
+
|
|
161
|
+
if mode == "updates" and isinstance(data, dict):
|
|
162
|
+
update_data = data
|
|
163
|
+
if "__interrupt__" in data:
|
|
164
|
+
update_data = {
|
|
165
|
+
**data,
|
|
166
|
+
"__interrupt__": _convert_interrupts(data["__interrupt__"]),
|
|
167
|
+
}
|
|
168
|
+
yield (ns, "updates", update_data)
|
|
169
|
+
continue
|
|
170
|
+
|
|
171
|
+
yield (ns, mode, data)
|
|
172
|
+
|
|
173
|
+
if dropped_count:
|
|
174
|
+
logger.warning(
|
|
175
|
+
"Dropped %d message(s) during stream due to conversion failures",
|
|
176
|
+
dropped_count,
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
async def aget_state(
|
|
180
|
+
self,
|
|
181
|
+
config: dict[str, Any],
|
|
182
|
+
) -> Any: # noqa: ANN401
|
|
183
|
+
"""Get the current state of a thread.
|
|
184
|
+
|
|
185
|
+
Returns `None` when the thread does not exist on the server (404).
|
|
186
|
+
All other errors (network, auth, 500) are logged at WARNING and
|
|
187
|
+
re-raised so callers can handle them.
|
|
188
|
+
|
|
189
|
+
Args:
|
|
190
|
+
config: Config with `configurable.thread_id`.
|
|
191
|
+
|
|
192
|
+
Returns:
|
|
193
|
+
Thread state object with `values` and `next` attributes, or `None`
|
|
194
|
+
if the thread is not found.
|
|
195
|
+
|
|
196
|
+
Raises:
|
|
197
|
+
ValueError: If `thread_id` is not present in `config`.
|
|
198
|
+
""" # noqa: DOC502 — raised by _require_thread_id
|
|
199
|
+
from langgraph_sdk.errors import NotFoundError
|
|
200
|
+
|
|
201
|
+
thread_id = _require_thread_id(config)
|
|
202
|
+
|
|
203
|
+
graph = self._get_graph()
|
|
204
|
+
try:
|
|
205
|
+
return await graph.aget_state(_prepare_config(config))
|
|
206
|
+
except NotFoundError:
|
|
207
|
+
logger.debug("Thread %s not found on server", thread_id)
|
|
208
|
+
return None
|
|
209
|
+
except Exception:
|
|
210
|
+
logger.warning(
|
|
211
|
+
"Failed to get state for thread %s", thread_id, exc_info=True
|
|
212
|
+
)
|
|
213
|
+
raise
|
|
214
|
+
|
|
215
|
+
async def aupdate_state(
|
|
216
|
+
self,
|
|
217
|
+
config: dict[str, Any],
|
|
218
|
+
values: dict[str, Any],
|
|
219
|
+
) -> None:
|
|
220
|
+
"""Update the state of a thread.
|
|
221
|
+
|
|
222
|
+
Exceptions from the underlying graph (server/network errors) are logged
|
|
223
|
+
at WARNING level and then re-raised so callers can handle them.
|
|
224
|
+
|
|
225
|
+
Args:
|
|
226
|
+
config: Config with `configurable.thread_id`.
|
|
227
|
+
values: State values to update.
|
|
228
|
+
|
|
229
|
+
Raises:
|
|
230
|
+
ValueError: If `thread_id` is not present in `config`.
|
|
231
|
+
""" # noqa: DOC502 — raised by _require_thread_id
|
|
232
|
+
thread_id = _require_thread_id(config)
|
|
233
|
+
|
|
234
|
+
graph = self._get_graph()
|
|
235
|
+
try:
|
|
236
|
+
await graph.aupdate_state(_prepare_config(config), values)
|
|
237
|
+
except Exception:
|
|
238
|
+
logger.warning(
|
|
239
|
+
"Failed to update state for thread %s", thread_id, exc_info=True
|
|
240
|
+
)
|
|
241
|
+
raise
|
|
242
|
+
|
|
243
|
+
async def aensure_thread(self, config: dict[str, Any]) -> None:
|
|
244
|
+
"""Ensure the remote thread record exists before mutating state.
|
|
245
|
+
|
|
246
|
+
In the LangGraph dev server, checkpoint persistence and HTTP thread
|
|
247
|
+
registration are separate. After a server restart, a thread may still
|
|
248
|
+
have checkpointed state on disk while `POST /threads/{id}/state`
|
|
249
|
+
returns 404 because the server has not yet materialized that thread in
|
|
250
|
+
its live store.
|
|
251
|
+
|
|
252
|
+
This method performs the idempotent HTTP-side registration with
|
|
253
|
+
`if_exists='do_nothing'` so callers that recovered state from
|
|
254
|
+
persistence can safely follow up with `aupdate_state`.
|
|
255
|
+
|
|
256
|
+
Args:
|
|
257
|
+
config: Config with `configurable.thread_id` and optional metadata.
|
|
258
|
+
|
|
259
|
+
Raises:
|
|
260
|
+
ValueError: If `thread_id` is not present in `config`.
|
|
261
|
+
""" # noqa: DOC502 — raised by _require_thread_id
|
|
262
|
+
_require_thread_id(config)
|
|
263
|
+
|
|
264
|
+
graph = self._get_graph()
|
|
265
|
+
prepared = _prepare_config(config)
|
|
266
|
+
thread_id = prepared["configurable"]["thread_id"]
|
|
267
|
+
metadata = prepared.get("metadata")
|
|
268
|
+
thread_metadata = metadata if isinstance(metadata, dict) else None
|
|
269
|
+
|
|
270
|
+
try:
|
|
271
|
+
client = graph._validate_client()
|
|
272
|
+
await client.threads.create(
|
|
273
|
+
thread_id=thread_id,
|
|
274
|
+
if_exists="do_nothing",
|
|
275
|
+
metadata=thread_metadata,
|
|
276
|
+
graph_id=self._graph_name,
|
|
277
|
+
)
|
|
278
|
+
except Exception:
|
|
279
|
+
logger.warning(
|
|
280
|
+
"Failed to ensure thread %s exists on remote server",
|
|
281
|
+
thread_id,
|
|
282
|
+
exc_info=True,
|
|
283
|
+
)
|
|
284
|
+
raise
|
|
285
|
+
|
|
286
|
+
def with_config(self, config: dict[str, Any]) -> RemoteAgent: # noqa: ARG002
|
|
287
|
+
"""Return self (config is passed per-call, not stored).
|
|
288
|
+
|
|
289
|
+
Args:
|
|
290
|
+
config: Ignored.
|
|
291
|
+
|
|
292
|
+
Returns:
|
|
293
|
+
Self.
|
|
294
|
+
"""
|
|
295
|
+
return self
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
# ---------------------------------------------------------------------------
|
|
299
|
+
# Config helpers
|
|
300
|
+
# ---------------------------------------------------------------------------
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
def _prepare_config(config: dict[str, Any] | None) -> dict[str, Any]:
|
|
304
|
+
"""Shallow-copy config so callers' dicts are not mutated.
|
|
305
|
+
|
|
306
|
+
Args:
|
|
307
|
+
config: Raw config dict.
|
|
308
|
+
|
|
309
|
+
Returns:
|
|
310
|
+
A shallow copy of the config.
|
|
311
|
+
"""
|
|
312
|
+
config = dict(config or {})
|
|
313
|
+
configurable = dict(config.get("configurable", {}))
|
|
314
|
+
config["configurable"] = configurable
|
|
315
|
+
return config
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
def _convert_interrupts(raw: Any) -> list[Any]: # noqa: ANN401
|
|
319
|
+
"""Convert interrupt dicts from the server into Interrupt objects.
|
|
320
|
+
|
|
321
|
+
Args:
|
|
322
|
+
raw: List of interrupt dicts or Interrupt objects from the server.
|
|
323
|
+
|
|
324
|
+
Returns:
|
|
325
|
+
List of Interrupt objects.
|
|
326
|
+
"""
|
|
327
|
+
from langgraph.types import Interrupt
|
|
328
|
+
|
|
329
|
+
if not isinstance(raw, list):
|
|
330
|
+
logger.warning(
|
|
331
|
+
"Expected list for __interrupt__ data, got %s",
|
|
332
|
+
type(raw).__name__,
|
|
333
|
+
)
|
|
334
|
+
return [raw] if raw is not None else []
|
|
335
|
+
results = []
|
|
336
|
+
for item in raw:
|
|
337
|
+
if isinstance(item, Interrupt):
|
|
338
|
+
results.append(item)
|
|
339
|
+
elif isinstance(item, dict) and "value" in item:
|
|
340
|
+
results.append(Interrupt(value=item["value"], id=item.get("id", "")))
|
|
341
|
+
else:
|
|
342
|
+
results.append(item)
|
|
343
|
+
return results
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
# ---------------------------------------------------------------------------
|
|
347
|
+
# Message conversion — per-type converters with a dispatch table
|
|
348
|
+
# ---------------------------------------------------------------------------
|
|
349
|
+
#
|
|
350
|
+
# Each converter handles one LangChain message type. The dispatch table
|
|
351
|
+
# maps type strings (both short and class-name forms) to the appropriate
|
|
352
|
+
# converter. This keeps each converter focused and makes adding new
|
|
353
|
+
# message types a one-line addition to the table.
|
|
354
|
+
# ---------------------------------------------------------------------------
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
def _convert_ai_message(data: dict[str, Any]) -> Any: # noqa: ANN401
|
|
358
|
+
"""Convert a server AI message dict to an `AIMessageChunk`.
|
|
359
|
+
|
|
360
|
+
Handles the three tool-call representations the server may emit:
|
|
361
|
+
|
|
362
|
+
- `tool_call_chunks`: streaming partial args (string `args`).
|
|
363
|
+
- `tool_calls` with string `args`: legacy streaming format,
|
|
364
|
+
normalized to `tool_call_chunks`.
|
|
365
|
+
- `tool_calls` with dict `args`: fully parsed calls.
|
|
366
|
+
|
|
367
|
+
Args:
|
|
368
|
+
data: Raw message dict from the server.
|
|
369
|
+
|
|
370
|
+
Returns:
|
|
371
|
+
An `AIMessageChunk`, or `None` on construction failure.
|
|
372
|
+
"""
|
|
373
|
+
from langchain_core.messages import AIMessageChunk
|
|
374
|
+
|
|
375
|
+
content = data.get("content", "")
|
|
376
|
+
tool_call_chunks = data.get("tool_call_chunks", [])
|
|
377
|
+
tool_calls = data.get("tool_calls", [])
|
|
378
|
+
usage_metadata = data.get("usage_metadata")
|
|
379
|
+
response_metadata = data.get("response_metadata", {})
|
|
380
|
+
|
|
381
|
+
kwargs: dict[str, Any] = {
|
|
382
|
+
"content": content,
|
|
383
|
+
"id": data.get("id"),
|
|
384
|
+
"response_metadata": response_metadata,
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
if tool_call_chunks:
|
|
388
|
+
kwargs["tool_call_chunks"] = [
|
|
389
|
+
{
|
|
390
|
+
"name": tc.get("name"),
|
|
391
|
+
"args": tc.get("args", ""),
|
|
392
|
+
"id": tc.get("id"),
|
|
393
|
+
"index": tc.get("index", i),
|
|
394
|
+
}
|
|
395
|
+
for i, tc in enumerate(tool_call_chunks)
|
|
396
|
+
]
|
|
397
|
+
elif tool_calls:
|
|
398
|
+
has_str_args = any(isinstance(tc.get("args"), str) for tc in tool_calls)
|
|
399
|
+
if has_str_args:
|
|
400
|
+
kwargs["tool_call_chunks"] = [
|
|
401
|
+
{
|
|
402
|
+
"name": tc.get("name"),
|
|
403
|
+
"args": tc.get("args", ""),
|
|
404
|
+
"id": tc.get("id"),
|
|
405
|
+
"index": i,
|
|
406
|
+
}
|
|
407
|
+
for i, tc in enumerate(tool_calls)
|
|
408
|
+
]
|
|
409
|
+
else:
|
|
410
|
+
kwargs["tool_calls"] = tool_calls
|
|
411
|
+
|
|
412
|
+
try:
|
|
413
|
+
chunk = AIMessageChunk(**kwargs)
|
|
414
|
+
except (TypeError, ValueError, KeyError):
|
|
415
|
+
logger.warning(
|
|
416
|
+
"Failed to construct AIMessageChunk from server data (id=%s)",
|
|
417
|
+
data.get("id"),
|
|
418
|
+
exc_info=True,
|
|
419
|
+
)
|
|
420
|
+
return None
|
|
421
|
+
|
|
422
|
+
if usage_metadata:
|
|
423
|
+
chunk.usage_metadata = usage_metadata
|
|
424
|
+
return chunk
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
def _convert_human_message(data: dict[str, Any]) -> Any: # noqa: ANN401
|
|
428
|
+
"""Convert a server human message dict to a `HumanMessage`.
|
|
429
|
+
|
|
430
|
+
Args:
|
|
431
|
+
data: Raw message dict from the server.
|
|
432
|
+
|
|
433
|
+
Returns:
|
|
434
|
+
A `HumanMessage`, or `None` on construction failure.
|
|
435
|
+
"""
|
|
436
|
+
from langchain_core.messages import HumanMessage
|
|
437
|
+
|
|
438
|
+
try:
|
|
439
|
+
return HumanMessage(
|
|
440
|
+
content=data.get("content", ""),
|
|
441
|
+
id=data.get("id"),
|
|
442
|
+
)
|
|
443
|
+
except (TypeError, ValueError, KeyError):
|
|
444
|
+
logger.warning(
|
|
445
|
+
"Failed to construct HumanMessage from server data (id=%s)",
|
|
446
|
+
data.get("id"),
|
|
447
|
+
exc_info=True,
|
|
448
|
+
)
|
|
449
|
+
return None
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
def _convert_tool_message(data: dict[str, Any]) -> Any: # noqa: ANN401
|
|
453
|
+
"""Convert a server tool message dict to a `ToolMessage`.
|
|
454
|
+
|
|
455
|
+
Args:
|
|
456
|
+
data: Raw message dict from the server.
|
|
457
|
+
|
|
458
|
+
Returns:
|
|
459
|
+
A `ToolMessage`, or `None` on construction failure.
|
|
460
|
+
"""
|
|
461
|
+
from langchain_core.messages import ToolMessage
|
|
462
|
+
|
|
463
|
+
try:
|
|
464
|
+
return ToolMessage(
|
|
465
|
+
content=data.get("content", ""),
|
|
466
|
+
tool_call_id=data.get("tool_call_id", ""),
|
|
467
|
+
name=data.get("name", ""),
|
|
468
|
+
id=data.get("id"),
|
|
469
|
+
status=data.get("status", "success"),
|
|
470
|
+
)
|
|
471
|
+
except (TypeError, ValueError, KeyError):
|
|
472
|
+
logger.warning(
|
|
473
|
+
"Failed to construct ToolMessage from server data (id=%s)",
|
|
474
|
+
data.get("id"),
|
|
475
|
+
exc_info=True,
|
|
476
|
+
)
|
|
477
|
+
return None
|
|
478
|
+
|
|
479
|
+
|
|
480
|
+
_MESSAGE_CONVERTERS: dict[str, Callable[[dict[str, Any]], Any]] = {
|
|
481
|
+
"ai": _convert_ai_message,
|
|
482
|
+
"AIMessage": _convert_ai_message,
|
|
483
|
+
"AIMessageChunk": _convert_ai_message,
|
|
484
|
+
"human": _convert_human_message,
|
|
485
|
+
"HumanMessage": _convert_human_message,
|
|
486
|
+
"tool": _convert_tool_message,
|
|
487
|
+
"ToolMessage": _convert_tool_message,
|
|
488
|
+
}
|
|
489
|
+
"""Maps server message `type` strings to their converter functions.
|
|
490
|
+
|
|
491
|
+
Both short forms (`'ai'`, `'human'`, `'tool'`) and class-name forms
|
|
492
|
+
(`'AIMessage'`, `'HumanMessage'`, `'ToolMessage'`) are supported so
|
|
493
|
+
the converter works regardless of how the server serializes the type field.
|
|
494
|
+
"""
|
|
495
|
+
|
|
496
|
+
|
|
497
|
+
def _convert_message_data(data: dict[str, Any]) -> Any: # noqa: ANN401
|
|
498
|
+
"""Convert a server message dict into a LangChain message object.
|
|
499
|
+
|
|
500
|
+
Dispatches to a per-type converter via `_MESSAGE_CONVERTERS`. New message
|
|
501
|
+
types can be supported by adding a converter function and a table entry —
|
|
502
|
+
no changes to this dispatcher are needed.
|
|
503
|
+
|
|
504
|
+
Args:
|
|
505
|
+
data: Message dict from the server.
|
|
506
|
+
|
|
507
|
+
Returns:
|
|
508
|
+
A LangChain message object, or `None` if conversion fails.
|
|
509
|
+
"""
|
|
510
|
+
msg_type = data.get("type", "")
|
|
511
|
+
converter = _MESSAGE_CONVERTERS.get(msg_type)
|
|
512
|
+
if converter is not None:
|
|
513
|
+
return converter(data)
|
|
514
|
+
logger.warning("Unknown message type in stream: %s", msg_type)
|
|
515
|
+
return None
|