myagent-ai 1.15.30 → 1.15.32
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/agents/__pycache__/main_agent.cpython-312.pyc +0 -0
- package/agents/__pycache__/memory_agent.cpython-312.pyc +0 -0
- package/agents/base.py +0 -1
- package/agents/main_agent.py +74 -185
- package/agents/memory_agent.py +5 -93
- package/config.py +1 -2
- package/core/__pycache__/context_builder.cpython-312.pyc +0 -0
- package/core/__pycache__/output_parser.cpython-312.pyc +0 -0
- package/core/context_builder.py +63 -279
- package/core/deps_checker.py +69 -26
- package/core/llm.py +0 -4
- package/core/output_parser.py +394 -428
- package/departments/manager.py +0 -4
- package/main.py +53 -34
- package/memory/__pycache__/manager.cpython-312.pyc +0 -0
- package/memory/manager.py +27 -204
- package/package.json +1 -1
- package/requirements.txt +2 -8
- package/setup.py +2 -5
- package/skills/ASR/LICENSE.txt +21 -0
- package/skills/ASR/SKILL.md +580 -0
- package/skills/ASR/scripts/asr.ts +27 -0
- package/skills/LLM/LICENSE.txt +21 -0
- package/skills/LLM/SKILL.md +856 -0
- package/skills/LLM/scripts/chat.ts +32 -0
- package/skills/TTS/LICENSE.txt +21 -0
- package/skills/TTS/SKILL.md +735 -0
- package/skills/TTS/scripts/tts.ts +25 -0
- package/skills/VLM/LICENSE.txt +21 -0
- package/skills/VLM/SKILL.md +621 -0
- package/skills/VLM/scripts/vlm.ts +57 -0
- package/skills/__pycache__/registry.cpython-312.pyc +0 -0
- package/skills/agent-browser/SKILL.md +327 -0
- package/skills/ai-news-collectors/SKILL.md +157 -0
- package/skills/ai-news-collectors/_meta.json +6 -0
- package/skills/ai-news-collectors/references/sources.md +128 -0
- package/skills/aminer-open-academic/SKILL.md +312 -0
- package/skills/aminer-open-academic/_meta.json +6 -0
- package/skills/aminer-open-academic/evals/evals.json +46 -0
- package/skills/aminer-open-academic/references/api-catalog.md +1032 -0
- package/skills/aminer-open-academic/scripts/aminer_client.py +875 -0
- package/skills/auto-target-tracker/SKILL.md +316 -0
- package/skills/browser_skill.py +768 -24
- package/skills/charts/LICENSE.txt +13 -0
- package/skills/charts/SKILL.md +427 -0
- package/skills/charts/references/_rules.md +49 -0
- package/skills/charts/references/d3.md +199 -0
- package/skills/charts/references/echarts.md +651 -0
- package/skills/charts/references/matplotlib.md +617 -0
- package/skills/charts/references/mermaid.md +797 -0
- package/skills/charts/references/mindmap-css.md +911 -0
- package/skills/charts/references/playwright-css.md +801 -0
- package/skills/charts/references/radial-grid.md +576 -0
- package/skills/charts/references/seaborn.md +324 -0
- package/skills/charts/setup.sh +228 -0
- package/skills/coding-agent/SKILL.md +119 -0
- package/skills/coding-agent/_meta.json +6 -0
- package/skills/coding-agent/criteria.md +48 -0
- package/skills/coding-agent/execution.md +42 -0
- package/skills/coding-agent/memory-template.md +38 -0
- package/skills/coding-agent/planning.md +31 -0
- package/skills/coding-agent/state.md +60 -0
- package/skills/coding-agent/verification.md +39 -0
- package/skills/contentanalysis/ExtractWisdom/SKILL.md +226 -0
- package/skills/contentanalysis/ExtractWisdom/Workflows/Extract.md +60 -0
- package/skills/contentanalysis/SKILL.md +14 -0
- package/skills/docx/CHANGELOG.md +85 -0
- package/skills/docx/LICENSE.txt +13 -0
- package/skills/docx/SKILL.md +200 -0
- package/skills/docx/docx-js.md +681 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/skills/docx/ooxml/schemas/mce/mc.xsd +75 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/skills/docx/ooxml/scripts/pack.py +159 -0
- package/skills/docx/ooxml/scripts/unpack.py +29 -0
- package/skills/docx/ooxml/scripts/validate.py +69 -0
- package/skills/docx/ooxml/scripts/validation/__init__.py +15 -0
- package/skills/docx/ooxml/scripts/validation/base.py +951 -0
- package/skills/docx/ooxml/scripts/validation/docx.py +274 -0
- package/skills/docx/ooxml/scripts/validation/pptx.py +315 -0
- package/skills/docx/ooxml/scripts/validation/redlining.py +279 -0
- package/skills/docx/ooxml.md +615 -0
- package/skills/docx/references/chart-templates.md +386 -0
- package/skills/docx/references/common-rules.md +419 -0
- package/skills/docx/references/decorations.md +538 -0
- package/skills/docx/references/design-system.md +1797 -0
- package/skills/docx/references/docx-js-advanced.md +257 -0
- package/skills/docx/references/docx-js-core.md +333 -0
- package/skills/docx/references/faq.md +323 -0
- package/skills/docx/references/math-formulas.md +276 -0
- package/skills/docx/references/ooxml.md +222 -0
- package/skills/docx/references/toc.md +254 -0
- package/skills/docx/routes/comment.md +88 -0
- package/skills/docx/routes/create.md +207 -0
- package/skills/docx/routes/edit.md +115 -0
- package/skills/docx/routes/format.md +120 -0
- package/skills/docx/routes/read.md +114 -0
- package/skills/docx/scenes/academic.md +783 -0
- package/skills/docx/scenes/contract.md +463 -0
- package/skills/docx/scenes/copywriting.md +139 -0
- package/skills/docx/scenes/exam.md +698 -0
- package/skills/docx/scenes/official-doc.md +411 -0
- package/skills/docx/scenes/report.md +340 -0
- package/skills/docx/scenes/resume.md +534 -0
- package/skills/docx/scripts/__init__.py +1 -0
- package/skills/docx/scripts/add_toc_placeholders.py +749 -0
- package/skills/docx/scripts/document.py +1333 -0
- package/skills/docx/scripts/postcheck.py +807 -0
- package/skills/docx/scripts/templates/comments.xml +3 -0
- package/skills/docx/scripts/templates/commentsExtended.xml +3 -0
- package/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/skills/docx/scripts/templates/commentsIds.xml +3 -0
- package/skills/docx/scripts/templates/people.xml +3 -0
- package/skills/docx/scripts/utilities.py +374 -0
- package/skills/docx/setup.sh +177 -0
- package/skills/finance/Finance_API_Doc.md +445 -0
- package/skills/finance/SKILL.md +53 -0
- package/skills/gift-evaluator/SKILL.md +83 -0
- package/skills/gift-evaluator/html_tools.py +268 -0
- package/skills/image-edit/LICENSE.txt +21 -0
- package/skills/image-edit/SKILL.md +896 -0
- package/skills/image-edit/scripts/image-edit.ts +36 -0
- package/skills/image-generation/LICENSE.txt +21 -0
- package/skills/image-generation/SKILL.md +583 -0
- package/skills/image-generation/scripts/image-generation.ts +28 -0
- package/skills/market-research-reports/SKILL.md +901 -0
- package/skills/market-research-reports/assets/FORMATTING_GUIDE.md +428 -0
- package/skills/market-research-reports/assets/market_report_template.tex +1380 -0
- package/skills/market-research-reports/assets/market_research.sty +564 -0
- package/skills/market-research-reports/references/data_analysis_patterns.md +548 -0
- package/skills/market-research-reports/references/report_structure_guide.md +999 -0
- package/skills/market-research-reports/references/visual_generation_guide.md +1077 -0
- package/skills/market-research-reports/scripts/generate_market_visuals.py +529 -0
- package/skills/marketing-mode/README.md +49 -0
- package/skills/marketing-mode/SKILL.md +677 -0
- package/skills/marketing-mode/_meta.json +6 -0
- package/skills/marketing-mode/mode-prompt.md +39 -0
- package/skills/marketing-mode/skill.json +20 -0
- package/skills/pdf/LICENSE.txt +13 -0
- package/skills/pdf/SKILL.md +927 -0
- package/skills/pdf/briefs/academic.md +1049 -0
- package/skills/pdf/briefs/creative.md +770 -0
- package/skills/pdf/briefs/poster.md +702 -0
- package/skills/pdf/briefs/process-advanced.md +284 -0
- package/skills/pdf/briefs/process.md +319 -0
- package/skills/pdf/briefs/report.md +1657 -0
- package/skills/pdf/configs/components.md +153 -0
- package/skills/pdf/configs/fonts.md +93 -0
- package/skills/pdf/configs/visual_framework.md +263 -0
- package/skills/pdf/forms.md +205 -0
- package/skills/pdf/reference.md +765 -0
- package/skills/pdf/references/resume-academic.tex +130 -0
- package/skills/pdf/references/resume-altacv.tex +190 -0
- package/skills/pdf/scripts/add_zai_metadata.py +172 -0
- package/skills/pdf/scripts/check_bounding_boxes.py +70 -0
- package/skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
- package/skills/pdf/scripts/check_fillable_fields.py +12 -0
- package/skills/pdf/scripts/convert_pdf_to_images.py +35 -0
- package/skills/pdf/scripts/cover_validate.js +367 -0
- package/skills/pdf/scripts/create_validation_image.py +41 -0
- package/skills/pdf/scripts/design_engine.py +2816 -0
- package/skills/pdf/scripts/extract_form_field_info.py +152 -0
- package/skills/pdf/scripts/fill_fillable_fields.py +114 -0
- package/skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
- package/skills/pdf/scripts/html2pdf-next.js +754 -0
- package/skills/pdf/scripts/html2poster.js +256 -0
- package/skills/pdf/scripts/pdf.py +2959 -0
- package/skills/pdf/scripts/pdf_qa.py +901 -0
- package/skills/pdf/scripts/poster_validate.py +1337 -0
- package/skills/pdf/scripts/sanitize_code.py +110 -0
- package/skills/pdf/scripts/setup.sh +269 -0
- package/skills/pdf/scripts/tectonic +0 -0
- package/skills/pdf/scripts/toc_validate.py +2075 -0
- package/skills/pdf/typesetting/charts.md +320 -0
- package/skills/pdf/typesetting/cover-backgrounds.md +384 -0
- package/skills/pdf/typesetting/cover.md +1442 -0
- package/skills/pdf/typesetting/fill-engine.md +527 -0
- package/skills/pdf/typesetting/geometry.md +142 -0
- package/skills/pdf/typesetting/overflow.md +630 -0
- package/skills/pdf/typesetting/pagination.md +367 -0
- package/skills/pdf/typesetting/palette.md +217 -0
- package/skills/pdf/typesetting/typography.md +20 -0
- package/skills/podcast-generate/LICENSE.txt +21 -0
- package/skills/podcast-generate/SKILL.md +198 -0
- package/skills/podcast-generate/generate.ts +661 -0
- package/skills/podcast-generate/package.json +30 -0
- package/skills/podcast-generate/readme.md +177 -0
- package/skills/podcast-generate/test_data/segments.jsonl +3 -0
- package/skills/podcast-generate/tsconfig.json +26 -0
- package/skills/ppt/LICENSE.txt +13 -0
- package/skills/ppt/SKILL.md +436 -0
- package/skills/ppt/beamer.md +1457 -0
- package/skills/ppt/components.md +1634 -0
- package/skills/ppt/data-viz-components.md +529 -0
- package/skills/ppt/design-system.md +206 -0
- package/skills/ppt/html2pptx.md +394 -0
- package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/skills/ppt/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/skills/ppt/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/skills/ppt/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/skills/ppt/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/skills/ppt/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/skills/ppt/ooxml/schemas/mce/mc.xsd +75 -0
- package/skills/ppt/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/skills/ppt/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/skills/ppt/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/skills/ppt/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/skills/ppt/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/skills/ppt/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/skills/ppt/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/skills/ppt/ooxml/scripts/pack.py +159 -0
- package/skills/ppt/ooxml/scripts/unpack.py +29 -0
- package/skills/ppt/ooxml/scripts/validate.py +69 -0
- package/skills/ppt/ooxml/scripts/validation/__init__.py +15 -0
- package/skills/ppt/ooxml/scripts/validation/base.py +951 -0
- package/skills/ppt/ooxml/scripts/validation/docx.py +274 -0
- package/skills/ppt/ooxml/scripts/validation/pptx.py +315 -0
- package/skills/ppt/ooxml/scripts/validation/redlining.py +279 -0
- package/skills/ppt/ooxml.md +427 -0
- package/skills/ppt/references/beamer.md +721 -0
- package/skills/ppt/references/latex.md +342 -0
- package/skills/ppt/references/paper-navbar.tex +73 -0
- package/skills/ppt/references/progress-navbar.tex +151 -0
- package/skills/ppt/scripts/html2pptx.js +1329 -0
- package/skills/ppt/scripts/inventory.py +512 -0
- package/skills/ppt/scripts/pdf.py +2959 -0
- package/skills/ppt/scripts/rearrange.py +135 -0
- package/skills/ppt/scripts/replace.py +231 -0
- package/skills/ppt/scripts/tectonic +0 -0
- package/skills/ppt/scripts/thumbnail.py +352 -0
- package/skills/ppt/setup.sh +197 -0
- package/skills/ppt/themes.md +506 -0
- package/skills/qingyan-research/SKILL.md +294 -0
- package/skills/qingyan-research/generate_html.py +33 -0
- package/skills/registry.py +239 -6
- package/skills/search_skill.py +25 -88
- package/skills/seo-content-writer/SKILL.md +625 -0
- package/skills/seo-content-writer/_meta.json +6 -0
- package/skills/seo-content-writer/references/content-structure-templates.md +875 -0
- package/skills/seo-content-writer/references/title-formulas.md +339 -0
- package/skills/skill-creator/LICENSE.txt +202 -0
- package/skills/skill-creator/SKILL.md +485 -0
- package/skills/skill-creator/agents/analyzer.md +274 -0
- package/skills/skill-creator/agents/comparator.md +202 -0
- package/skills/skill-creator/agents/grader.md +223 -0
- package/skills/skill-creator/assets/eval_review.html +146 -0
- package/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/skills/skill-creator/references/schemas.md +430 -0
- package/skills/skill-creator/scripts/__init__.py +0 -0
- package/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/skills/skill-creator/scripts/generate_report.py +326 -0
- package/skills/skill-creator/scripts/improve_description.py +236 -0
- package/skills/skill-creator/scripts/package_skill.py +136 -0
- package/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/skills/skill-creator/scripts/run_eval.py +310 -0
- package/skills/skill-creator/scripts/run_loop.py +328 -0
- package/skills/skill-creator/scripts/utils.py +47 -0
- package/skills/stock-analysis-skill/SKILL.md +156 -0
- package/skills/stock-analysis-skill/package.json +21 -0
- package/skills/stock-analysis-skill/src/analyzer.ts +264 -0
- package/skills/stock-analysis-skill/src/dataFetcher.ts +130 -0
- package/skills/stock-analysis-skill/src/dividend.ts +226 -0
- package/skills/stock-analysis-skill/src/index.ts +327 -0
- package/skills/stock-analysis-skill/src/rumorScanner.ts +200 -0
- package/skills/stock-analysis-skill/src/types.ts +167 -0
- package/skills/stock-analysis-skill/src/watchlist.ts +308 -0
- package/skills/stock-analysis-skill/tsconfig.json +15 -0
- package/skills/storyboard-manager/SKILL.md +532 -0
- package/skills/storyboard-manager/index.js +9 -0
- package/skills/storyboard-manager/package.json +11 -0
- package/skills/storyboard-manager/references/character_development.md +232 -0
- package/skills/storyboard-manager/references/story_structures.md +148 -0
- package/skills/storyboard-manager/scripts/consistency_checker.py +391 -0
- package/skills/storyboard-manager/scripts/timeline_tracker.py +352 -0
- package/skills/ui-ux-pro-max/SKILL.md +43 -0
- package/skills/ui-ux-pro-max/_meta.json +6 -0
- package/skills/ui-ux-pro-max/assets/data/charts.csv +26 -0
- package/skills/ui-ux-pro-max/assets/data/colors.csv +97 -0
- package/skills/ui-ux-pro-max/assets/data/icons.csv +101 -0
- package/skills/ui-ux-pro-max/assets/data/landing.csv +31 -0
- package/skills/ui-ux-pro-max/assets/data/products.csv +97 -0
- package/skills/ui-ux-pro-max/assets/data/react-performance.csv +45 -0
- package/skills/ui-ux-pro-max/assets/data/stacks/astro.csv +54 -0
- package/skills/ui-ux-pro-max/assets/data/stacks/flutter.csv +53 -0
- package/skills/ui-ux-pro-max/assets/data/stacks/html-tailwind.csv +56 -0
- package/skills/ui-ux-pro-max/assets/data/stacks/jetpack-compose.csv +53 -0
- package/skills/ui-ux-pro-max/assets/data/stacks/nextjs.csv +53 -0
- package/skills/ui-ux-pro-max/assets/data/stacks/nuxt-ui.csv +51 -0
- package/skills/ui-ux-pro-max/assets/data/stacks/nuxtjs.csv +59 -0
- package/skills/ui-ux-pro-max/assets/data/stacks/react-native.csv +52 -0
- package/skills/ui-ux-pro-max/assets/data/stacks/react.csv +54 -0
- package/skills/ui-ux-pro-max/assets/data/stacks/shadcn.csv +61 -0
- package/skills/ui-ux-pro-max/assets/data/stacks/svelte.csv +54 -0
- package/skills/ui-ux-pro-max/assets/data/stacks/swiftui.csv +51 -0
- package/skills/ui-ux-pro-max/assets/data/stacks/vue.csv +50 -0
- package/skills/ui-ux-pro-max/assets/data/styles.csv +68 -0
- package/skills/ui-ux-pro-max/assets/data/typography.csv +58 -0
- package/skills/ui-ux-pro-max/assets/data/ui-reasoning.csv +101 -0
- package/skills/ui-ux-pro-max/assets/data/ux-guidelines.csv +100 -0
- package/skills/ui-ux-pro-max/assets/data/web-interface.csv +31 -0
- package/skills/ui-ux-pro-max/references/upstream-README.md +488 -0
- package/skills/ui-ux-pro-max/references/upstream-skill-content.md +288 -0
- package/skills/ui-ux-pro-max/scripts/__init__.py +0 -0
- package/skills/ui-ux-pro-max/scripts/core.py +253 -0
- package/skills/ui-ux-pro-max/scripts/design_system.py +1071 -0
- package/skills/ui-ux-pro-max/scripts/search.py +111 -0
- package/skills/video-generation/LICENSE.txt +21 -0
- package/skills/video-generation/SKILL.md +1082 -0
- package/skills/video-generation/scripts/video.ts +168 -0
- package/skills/web-reader/LICENSE.txt +21 -0
- package/skills/web-reader/SKILL.md +1140 -0
- package/skills/web-reader/scripts/web-reader.ts +37 -0
- package/skills/web-search/LICENSE.txt +21 -0
- package/skills/web-search/SKILL.md +912 -0
- package/skills/web-search/scripts/web_search.ts +44 -0
- package/skills/web-shader-extractor/SKILL.md +145 -0
- package/skills/web-shader-extractor/references/config-extraction.md +50 -0
- package/skills/web-shader-extractor/references/encoded-definitions.md +53 -0
- package/skills/web-shader-extractor/references/extraction-workflow.md +61 -0
- package/skills/web-shader-extractor/references/porting-strategy.md +164 -0
- package/skills/web-shader-extractor/references/shader-injection.md +126 -0
- package/skills/web-shader-extractor/references/shaders-com.md +190 -0
- package/skills/web-shader-extractor/references/tech-signatures.md +54 -0
- package/skills/web-shader-extractor/references/tsl-extraction.md +41 -0
- package/skills/web-shader-extractor/references/unicorn-studio.md +353 -0
- package/skills/web-shader-extractor/scripts/fetch-rendered-dom.mjs +153 -0
- package/skills/web-shader-extractor/scripts/scan-bundle.sh +76 -0
- package/skills/writing-plans/SKILL.md +113 -0
- package/skills/writing-plans/_meta.json +6 -0
- package/skills/xlsx/LICENSE.txt +13 -0
- package/skills/xlsx/SKILL.md +230 -0
- package/skills/xlsx/engines/chart-templates.md +167 -0
- package/skills/xlsx/engines/chart.md +87 -0
- package/skills/xlsx/engines/design.md +575 -0
- package/skills/xlsx/engines/vba-templates.md +435 -0
- package/skills/xlsx/quality/pipeline.md +196 -0
- package/skills/xlsx/recalc.py +178 -0
- package/skills/xlsx/scenes/advanced.md +271 -0
- package/skills/xlsx/scenes/analyze-recipes.md +234 -0
- package/skills/xlsx/scenes/analyze.md +95 -0
- package/skills/xlsx/scenes/convert.md +133 -0
- package/skills/xlsx/scenes/create.md +105 -0
- package/skills/xlsx/scenes/edit-patterns.md +222 -0
- package/skills/xlsx/scenes/edit.md +195 -0
- package/skills/xlsx/scenes/finance.md +318 -0
- package/skills/xlsx/scenes/finance_lite.md +192 -0
- package/skills/xlsx/scenes/vba.md +298 -0
- package/skills/xlsx/setup.sh +136 -0
- package/skills/xlsx/templates/base.py +632 -0
- package/skills/xlsx/templates/palettes.py +521 -0
- package/skills/xlsx/xlsx.py +1299 -0
- package/start.js +0 -1
- package/web/__pycache__/api_server.cpython-312.pyc +0 -0
- package/web/api_server.py +195 -612
- package/web/ui/chat/chat.css +191 -45
- package/web/ui/chat/chat.js +39 -16
- package/web/ui/chat/chat_container.html +12 -256
- package/web/ui/chat/chat_main.js +488 -662
- package/web/ui/chat/flow_engine.js +192 -416
- package/web/ui/chat/groupchat.js +3 -1
- package/web/ui/chat/left_sessions.html +1 -1
- package/web/ui/chat/middle_chat.html +21 -4
- package/web/ui/chat/right_agents.html +1 -1
- package/web/ui/index.html +200 -231
- package/core/__pycache__/deps_checker.cpython-312.pyc +0 -0
- package/skills/chromedev_mcp.py +0 -933
|
Binary file
|
|
Binary file
|
package/agents/base.py
CHANGED
package/agents/main_agent.py
CHANGED
|
@@ -6,7 +6,6 @@ agents/main_agent.py - 主 Agent
|
|
|
6
6
|
from __future__ import annotations
|
|
7
7
|
|
|
8
8
|
import asyncio
|
|
9
|
-
import re
|
|
10
9
|
from typing import Any, Callable, Dict, List, Optional
|
|
11
10
|
|
|
12
11
|
from core.logger import get_logger
|
|
@@ -43,48 +42,41 @@ class MainAgent(BaseAgent):
|
|
|
43
42
|
严格以XML格式化输出以下内容:
|
|
44
43
|
<output>
|
|
45
44
|
<response>直接回复用户的内容。这是一段友好、自然的话语,用于向用户说明你正在做什么,或者回应用户的问题/问候。要求简洁、有礼貌、符合对话场景。如果用户只是问候,简单回应即可;如果用户有具体任务,要说明你的计划。</response>
|
|
46
|
-
<usersays_correct>根据用户输入的"usersays"
|
|
47
|
-
<task_plan
|
|
45
|
+
<usersays_correct>根据用户输入的"usersays"内容,结合上下文优化为新的用户输入,如果"usersays"为空,这里输出为空。</usersays_correct>
|
|
46
|
+
<task_plan>如"context"包含非空"task_plan",则更新它,变为当前输出。否则,根据"context", 以MD 的格式,制定新任务列表。</task_plan>
|
|
48
47
|
|
|
49
48
|
<toolstocal>
|
|
50
49
|
<tool><beforecalltext>连接词,介绍调用什么工具,达到什么目的。</beforecalltext><toolname>工具名</toolname><parms>JSON格式的参数对象,例如: {"query": "搜索关键词", "num": 5}</parms><timeout>预估超时时限(秒)</timeout><callback>true/false,要求解析器在该工具执行完后是否要回调llm大模型,将所有工具输出结果+新构造的"context"输入给llm</callback></tool>
|
|
51
50
|
</toolstocal>
|
|
52
51
|
<remember><type>global或session</type><content>仅从最新用户输入(userprint 或 usersays_correct)中提炼值得记忆的信息(如用户偏好、重要结论、错误经验等)。type=global表示跨会话全局记忆,type=session表示仅当前会话可用的记忆。如果本轮没有新信息需要记忆,则<content>为空、<type>不填。</content></remember>
|
|
53
|
-
<recall
|
|
52
|
+
<recall>下一轮执行需要调取的记忆,这里要设计接上记忆库</recall>
|
|
54
53
|
<knowledge>从本轮对话或工具执行结果中提炼值得长期保存到知识库的专业知识、事实、经验法则、技术要点等。这些知识将被持久化存储,未来可通过 <get_knowledge> 检索复用。如果本轮没有需要保存的知识,则为空。格式要求:简洁明确,每条知识一行,用换行分隔。</knowledge>
|
|
55
54
|
<get_knowledge>下一轮执行时需要从知识库搜索获得的知识,填写检索关键词或描述。如context中已包含充足的<knowledge>内容,则为空。如需更多专业知识支撑,则填写相关搜索词。</get_knowledge>
|
|
56
55
|
<askuser>需要询问用户的内容,如无,则为空</askuser>
|
|
57
56
|
<finish>true/false,是否结束循环调用llm。如"askuser"为非空,则"finish"输出true。否则,根据"context"判断任务是否已完成,是否结束llm回调</finish>
|
|
58
57
|
<finish_reason>当 finish=true 时必填,详细说明为什么现在结束任务(如:任务已完成/需要用户补充信息/信息不足无法继续等)。finish=false 时为空。</finish_reason>
|
|
59
58
|
<next_step>当 finish=false 时必填,描述下一步计划做什么(简洁明了,1-2句话)。finish=true 时为空。</next_step>
|
|
60
|
-
<mainsubject>为当前对话生成一个简短的标题(6个字以内),概括对话主题。仅在对话刚开始(前几轮)时需要输出,已有标题的对话此标签留空即可。要求简洁精炼,例如"Python安装"、"请假流程"、"翻译助手"等。</mainsubject>
|
|
61
59
|
|
|
62
60
|
</output>
|
|
63
61
|
|
|
64
62
|
## 核心规则
|
|
65
63
|
1. 你必须且只能输出 <output> XML 结构,不要输出任何其他文本
|
|
66
64
|
2. <response>: 必须输出一段直接回复用户的话语(这是用户实际看到的回复),要求简洁友好、自然流畅。不要只输出任务计划而不说话!
|
|
67
|
-
3. <usersays_correct>: 如果 context 中 usersays
|
|
68
|
-
4. <task_plan>:
|
|
65
|
+
3. <usersays_correct>: 如果 context 中 usersays 非空,则根据对话语境优化为更准确的用户意图表达
|
|
66
|
+
4. <task_plan>: 使用 Markdown 列表格式,每项包含任务描述和完成状态标记 [x]/[ ]
|
|
69
67
|
5. <toolstocal>: 列出所有需要执行的工具调用,每个工具包含完整的参数说明
|
|
70
68
|
6. <parms>: **必须使用严格合法的JSON格式**,例如 {"query": "关键词", "num": 10},不要使用其他格式
|
|
71
69
|
7. <timeout>: 预估超时秒数(简单操作10-30s,文件操作30-60s,网络请求60-120s,数据处理120-300s)
|
|
72
70
|
8. <callback>: 如果该工具的执行结果对后续决策有影响,设为 true;否则设为 false
|
|
73
71
|
9. <remember>: 包含 <type> 和 <content> 子标签。type 填 "global"(跨会话全局记忆)或 "session"(仅当前会话)。content 填从最新用户输入中提炼的值得记忆的关键信息。如果本轮无需记忆,content 为空且不填 type。注意:用户个人偏好、重要结论、通用经验用 global;当前任务的临时上下文、过程信息用 session
|
|
74
|
-
10. <recall>:
|
|
72
|
+
10. <recall>: 描述下一轮执行时需要从记忆库中检索的内容关键词
|
|
75
73
|
11. <knowledge>: 从本轮对话或工具执行结果中提炼值得长期保存的专业知识、事实、经验法则、技术要点等。这些知识会被持久化到知识库文件,未来可通过 get_knowledge 检索复用。如果没有需要保存的知识,则为空。格式:简洁明确,每条知识一行
|
|
76
74
|
12. <get_knowledge>: 如果当前 <knowledge> 内容不足以完成任务,填写需要从知识库搜索的关键词;否则为空
|
|
77
75
|
13. <askuser>: 当信息不足需要用户补充时,在此填写要问的问题
|
|
78
76
|
14. <finish>: 当任务已完成或需要等待用户回应时为 true;否则为 false 继续执行
|
|
79
77
|
15. <finish_reason>: **finish=true 时必须填写**,详细说明结束原因(任务完成/等待用户/信息不足/无法处理等)
|
|
80
78
|
16. <next_step>: **finish=false 时必须填写**,描述下一步计划做什么,要求简洁明确(1-2句话)
|
|
81
|
-
17.
|
|
82
|
-
18. 使用中文输出所有内容
|
|
83
|
-
|
|
84
|
-
## 上下文中的记忆系统说明
|
|
85
|
-
- <automemory>: 系统自动根据你通过 <remember> 保存的记忆和当前用户输入,搜索出的 top10 相关记忆。这些是你过去主动记住的内容(包含时间信息),可供参考。
|
|
86
|
-
- <recall_memory>: 你在上一轮通过 <recall> 指定的记忆搜索结果。系统根据你提供的关键字和时间点搜索了 top5 相关记忆。
|
|
87
|
-
- 两种记忆互补:automemory 是自动匹配的,recall_memory 是你主动指定搜索的。如果 automemory 不足,使用 <recall> 请求更多。
|
|
79
|
+
17. 使用中文输出所有内容
|
|
88
80
|
|
|
89
81
|
## 工具选择指南
|
|
90
82
|
- **搜索信息**: 用 `web_search`(返回标题+URL+摘要),不要用 browser_open
|
|
@@ -93,7 +85,6 @@ class MainAgent(BaseAgent):
|
|
|
93
85
|
- **执行代码**: 用 `code` 工具(language: python/javascript/shell)
|
|
94
86
|
- **执行命令**: 用 `command` 或 `command_run` 工具
|
|
95
87
|
- **文件操作**: 用 `file_read` / `file_write` / `file_list` 等文件工具
|
|
96
|
-
- **主动召回记忆**: 用 `recall_memory` 工具(参数: keyword=关键字, time_point=可选时间点如"2025-01", limit=数量默认5),根据关键字和时间搜索历史记忆
|
|
97
88
|
"""
|
|
98
89
|
|
|
99
90
|
def __init__(self, tool_agent=None, memory_agent=None, **kwargs):
|
|
@@ -111,19 +102,14 @@ class MainAgent(BaseAgent):
|
|
|
111
102
|
# 活跃会话上下文追踪(用于消息注入)
|
|
112
103
|
self.active_contexts: Dict[str, AgentContext] = {}
|
|
113
104
|
|
|
114
|
-
def init_context_builder(self, memory_manager=None, skill_registry=None, knowledge_base_dir=None
|
|
105
|
+
def init_context_builder(self, memory_manager=None, skill_registry=None, knowledge_base_dir=None):
|
|
115
106
|
"""初始化 Context Builder(在系统启动后调用,注入依赖)"""
|
|
116
|
-
if context_window is None and self.llm:
|
|
117
|
-
context_window = getattr(self.llm, 'context_window', 128000)
|
|
118
|
-
if context_window is None:
|
|
119
|
-
context_window = 128000
|
|
120
107
|
self.context_builder = ContextBuilder(
|
|
121
108
|
memory_manager=memory_manager,
|
|
122
109
|
skill_registry=skill_registry,
|
|
123
110
|
knowledge_base_dir=knowledge_base_dir,
|
|
124
|
-
context_window=context_window,
|
|
125
111
|
)
|
|
126
|
-
logger.info(
|
|
112
|
+
logger.info("Context Builder 已初始化" + (f" (知识库: {knowledge_base_dir})" if knowledge_base_dir else ""))
|
|
127
113
|
|
|
128
114
|
def _add_exec_event(self, event_type: str, data: Dict):
|
|
129
115
|
"""记录一个执行事件(供前端展示)"""
|
|
@@ -295,24 +281,14 @@ class MainAgent(BaseAgent):
|
|
|
295
281
|
Returns:
|
|
296
282
|
True 表示成功存储了新知识,False 表示跳过(重复)或失败
|
|
297
283
|
"""
|
|
298
|
-
if not self.context_builder:
|
|
284
|
+
if not self.context_builder or not self.context_builder.knowledge_base_dir:
|
|
299
285
|
logger.debug(f"[{task_id}] 知识库未配置,跳过 knowledge 存储")
|
|
300
286
|
return False
|
|
301
287
|
|
|
302
288
|
from datetime import datetime
|
|
303
289
|
from pathlib import Path
|
|
304
290
|
|
|
305
|
-
|
|
306
|
-
kb_dir = None
|
|
307
|
-
if self.context_builder.agent_knowledge_dir:
|
|
308
|
-
kb_dir = Path(self.context_builder.agent_knowledge_dir)
|
|
309
|
-
elif self.context_builder.knowledge_base_dir:
|
|
310
|
-
kb_dir = Path(self.context_builder.knowledge_base_dir)
|
|
311
|
-
|
|
312
|
-
if not kb_dir:
|
|
313
|
-
logger.debug(f"[{task_id}] 知识库目录未配置,跳过 knowledge 存储")
|
|
314
|
-
return False
|
|
315
|
-
|
|
291
|
+
kb_dir = Path(self.context_builder.knowledge_base_dir)
|
|
316
292
|
auto_kb_dir = kb_dir / "auto_knowledge"
|
|
317
293
|
auto_kb_dir.mkdir(parents=True, exist_ok=True)
|
|
318
294
|
|
|
@@ -383,7 +359,7 @@ class MainAgent(BaseAgent):
|
|
|
383
359
|
f.write(f"\n## {now_str}\n")
|
|
384
360
|
f.write(content.strip() + "\n")
|
|
385
361
|
logger.info(
|
|
386
|
-
f"[{task_id}] 知识已存入知识库: {kb_file} "
|
|
362
|
+
f"[{task_id}] 知识已存入知识库: {kb_file.name} "
|
|
387
363
|
f"({len(content)} 字符, {len(content.strip().split(chr(10)))} 条)"
|
|
388
364
|
)
|
|
389
365
|
return True
|
|
@@ -460,8 +436,6 @@ class MainAgent(BaseAgent):
|
|
|
460
436
|
get_knowledge_content = ""
|
|
461
437
|
# 追踪流式推送的 reasoning 文本(用于构建有意义的最终回复)
|
|
462
438
|
_v2_reasoning_collected: List[str] = []
|
|
463
|
-
# XML 解析失败时的 LLM 修正重试计数
|
|
464
|
-
_xml_correction_retries: int = 0
|
|
465
439
|
|
|
466
440
|
conversation_history = list(context.conversation_history or [])
|
|
467
441
|
|
|
@@ -474,23 +448,13 @@ class MainAgent(BaseAgent):
|
|
|
474
448
|
)
|
|
475
449
|
if db_history:
|
|
476
450
|
conversation_history = [
|
|
477
|
-
Message(
|
|
478
|
-
role=entry.role,
|
|
479
|
-
content=entry.content,
|
|
480
|
-
metadata={"time": (entry.created_at[:19] if entry.created_at else "")}
|
|
481
|
-
)
|
|
451
|
+
Message(role=entry.role, content=entry.content)
|
|
482
452
|
for entry in db_history
|
|
483
453
|
]
|
|
484
454
|
logger.info(f"[{task_id}] 从 DB 加载了 {len(conversation_history)} 条历史对话")
|
|
485
455
|
except Exception as e:
|
|
486
456
|
logger.warning(f"[{task_id}] 加载历史对话失败: {e}")
|
|
487
457
|
|
|
488
|
-
# [v1.15.8] 计算历史用户消息数(用于判断是否需要自动命名会话)
|
|
489
|
-
_history_user_msg_count = sum(
|
|
490
|
-
1 for m in conversation_history if getattr(m, 'role', '') == 'user'
|
|
491
|
-
and getattr(m, 'metadata', {}).get('key', '') not in ('llm_output', 'conversation_insight')
|
|
492
|
-
)
|
|
493
|
-
|
|
494
458
|
# 保存用户消息到会话记忆
|
|
495
459
|
if self.memory:
|
|
496
460
|
self.memory.add_session(
|
|
@@ -516,7 +480,6 @@ class MainAgent(BaseAgent):
|
|
|
516
480
|
while self._iteration_count < max_iter:
|
|
517
481
|
self._iteration_count += 1
|
|
518
482
|
logger.info(f"[{task_id}] V2 迭代 {self._iteration_count}/{max_iter}")
|
|
519
|
-
_emitted_reasoning_this_iter = False # [v1.15.8] 本轮是否已发送过 v2_reasoning 事件(防 TTS 重复)
|
|
520
483
|
|
|
521
484
|
# ── 检查配置热加载广播 ──
|
|
522
485
|
if self.config_broadcaster:
|
|
@@ -541,7 +504,7 @@ class MainAgent(BaseAgent):
|
|
|
541
504
|
session_id=context.session_id,
|
|
542
505
|
conversation_history=conversation_history,
|
|
543
506
|
user_typed_text=context.user_message,
|
|
544
|
-
user_voice_text=
|
|
507
|
+
user_voice_text="",
|
|
545
508
|
task_plan=current_task_plan,
|
|
546
509
|
agent_override_prompt=agent_override_prompt,
|
|
547
510
|
get_knowledge=get_knowledge_content,
|
|
@@ -562,7 +525,7 @@ class MainAgent(BaseAgent):
|
|
|
562
525
|
+ self.SYSTEM_PROMPT.split("\n", 1)[1]
|
|
563
526
|
)
|
|
564
527
|
system_content = _prompt_with_placeholder.replace(_CONTEXT_PLACEHOLDER, context_xml)
|
|
565
|
-
# Step 3:
|
|
528
|
+
# Step 3: 调用 LLM
|
|
566
529
|
messages = [Message(role="system", content=system_content)]
|
|
567
530
|
|
|
568
531
|
if all_tool_outputs:
|
|
@@ -571,11 +534,6 @@ class MainAgent(BaseAgent):
|
|
|
571
534
|
content=f"[上一轮工具执行结果汇总]\n{truncate_str(all_tool_outputs, 30000)}"
|
|
572
535
|
))
|
|
573
536
|
all_tool_outputs = ""
|
|
574
|
-
else:
|
|
575
|
-
messages.append(Message(
|
|
576
|
-
role="user",
|
|
577
|
-
content=context.user_message or "请处理上述上下文。"
|
|
578
|
-
))
|
|
579
537
|
|
|
580
538
|
if stream_response and self.llm:
|
|
581
539
|
response = await self._call_llm_stream(
|
|
@@ -590,18 +548,12 @@ class MainAgent(BaseAgent):
|
|
|
590
548
|
error_msg = f"LLM 调用失败: {response.error}"
|
|
591
549
|
context.working_memory["final_response"] = error_msg
|
|
592
550
|
await self._emit_v2_event("v2_reasoning", {"content": error_msg}, stream_callback)
|
|
593
|
-
if self.memory:
|
|
594
|
-
self.memory.add_session(
|
|
595
|
-
session_id=context.session_id,
|
|
596
|
-
role="assistant",
|
|
597
|
-
content=error_msg,
|
|
598
|
-
)
|
|
599
551
|
break
|
|
600
552
|
|
|
601
553
|
llm_raw = response.content
|
|
602
554
|
logger.debug(f"[{task_id}] LLM 输出 (前500字): {llm_raw[:500]}")
|
|
603
555
|
|
|
604
|
-
# 保存 LLM
|
|
556
|
+
# 保存 LLM 原始输出到会话记忆(用于回溯和审计)
|
|
605
557
|
if self.memory:
|
|
606
558
|
self.memory.add_session(
|
|
607
559
|
session_id=context.session_id,
|
|
@@ -610,15 +562,6 @@ class MainAgent(BaseAgent):
|
|
|
610
562
|
key="llm_output",
|
|
611
563
|
importance=0.3,
|
|
612
564
|
)
|
|
613
|
-
# 保存推理模型的思考过程(key=reasoning 供前端刷新后展示)
|
|
614
|
-
if response.reasoning and response.reasoning.strip():
|
|
615
|
-
self.memory.add_session(
|
|
616
|
-
session_id=context.session_id,
|
|
617
|
-
role="assistant",
|
|
618
|
-
content=response.reasoning.strip(),
|
|
619
|
-
key="reasoning",
|
|
620
|
-
importance=0.2,
|
|
621
|
-
)
|
|
622
565
|
|
|
623
566
|
# Step 4: 解析结构化输出
|
|
624
567
|
parsed = parse_output(llm_raw)
|
|
@@ -634,61 +577,43 @@ class MainAgent(BaseAgent):
|
|
|
634
577
|
"finish": parsed.finish,
|
|
635
578
|
"finish_reason": truncate_str(parsed.finish_reason, 200),
|
|
636
579
|
"next_step": truncate_str(parsed.next_step, 200),
|
|
637
|
-
"response": truncate_str(parsed.response, 500),
|
|
638
580
|
"parse_success": parsed.parse_success,
|
|
639
|
-
"needs_correction": parsed.needs_correction,
|
|
640
581
|
}},
|
|
641
582
|
stream_callback,
|
|
642
583
|
)
|
|
643
584
|
|
|
644
|
-
# Step 4.5: 解析失败处理 — 回退给 LLM 修正或提取周边文本
|
|
645
585
|
if not parsed.parse_success:
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
logger.
|
|
650
|
-
f"[{task_id}] XML 解析完全失败,回退给 LLM 修正 "
|
|
651
|
-
f"(重试 {_xml_correction_retries}/1)"
|
|
652
|
-
)
|
|
653
|
-
correction_prompt = (
|
|
654
|
-
"你上一次的输出格式有误,XML解析器无法识别。"
|
|
655
|
-
"请严格按照 <output>...</output> 格式重新输出你的回答。"
|
|
656
|
-
"注意:不要在 <output> 标签前后输出任何其他文字。\n\n"
|
|
657
|
-
f"你上一次的原始输出如下:\n{llm_raw}"
|
|
658
|
-
)
|
|
659
|
-
conversation_history.append(
|
|
660
|
-
Message(role="assistant", content=llm_raw)
|
|
661
|
-
)
|
|
662
|
-
conversation_history.append(
|
|
663
|
-
Message(role="user", content=correction_prompt)
|
|
664
|
-
)
|
|
665
|
-
await self._emit_v2_event(
|
|
666
|
-
"v2_reasoning",
|
|
667
|
-
{"content": "⚠️ 模型输出格式异常,正在自动修正..."},
|
|
668
|
-
stream_callback,
|
|
669
|
-
)
|
|
670
|
-
continue # 重新进入循环,让 LLM 重新生成
|
|
586
|
+
logger.warning(f"[{task_id}] XML 解析失败 (parse_success=False)")
|
|
587
|
+
# 即使解析失败,如果 regex fallback 提取到了工具调用,仍然执行
|
|
588
|
+
if parsed.tools_to_call:
|
|
589
|
+
logger.info(f"[{task_id}] 但提取到 {len(parsed.tools_to_call)} 个工具调用,继续执行")
|
|
671
590
|
else:
|
|
672
|
-
|
|
673
|
-
logger.warning(f"[{task_id}] XML 解析失败,提取周边文本作为备选")
|
|
591
|
+
logger.warning(f"[{task_id}] 无工具调用可执行,尝试提取周边文本")
|
|
674
592
|
before, after = extract_surrounding_text(llm_raw)
|
|
675
593
|
if before.strip() or after.strip():
|
|
676
594
|
final_text = (before + "\n" + after).strip()
|
|
595
|
+
context.working_memory["final_response"] = final_text
|
|
596
|
+
await self._emit_v2_event("v2_reasoning", {"content": final_text}, stream_callback)
|
|
597
|
+
if self.memory:
|
|
598
|
+
self.memory.add_session(
|
|
599
|
+
session_id=context.session_id,
|
|
600
|
+
role="assistant",
|
|
601
|
+
content=final_text,
|
|
602
|
+
)
|
|
603
|
+
break
|
|
677
604
|
else:
|
|
678
|
-
#
|
|
679
|
-
|
|
680
|
-
final_text =
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
)
|
|
691
|
-
break
|
|
605
|
+
# XML 解析失败且无法提取文本,发送原始输出作为备选
|
|
606
|
+
logger.warning(f"[{task_id}] 无法提取文本,发送原始 LLM 输出")
|
|
607
|
+
final_text = llm_raw.strip() if llm_raw.strip() else "处理完毕。"
|
|
608
|
+
context.working_memory["final_response"] = final_text
|
|
609
|
+
await self._emit_v2_event("v2_reasoning", {"content": final_text}, stream_callback)
|
|
610
|
+
if self.memory:
|
|
611
|
+
self.memory.add_session(
|
|
612
|
+
session_id=context.session_id,
|
|
613
|
+
role="assistant",
|
|
614
|
+
content=final_text,
|
|
615
|
+
)
|
|
616
|
+
break
|
|
692
617
|
|
|
693
618
|
warnings = validate_output(parsed)
|
|
694
619
|
for w in warnings:
|
|
@@ -705,7 +630,6 @@ class MainAgent(BaseAgent):
|
|
|
705
630
|
logger.debug(f"[{task_id}] 模型回复用户: {response_text[:100]}")
|
|
706
631
|
context.working_memory["model_response"] = response_text
|
|
707
632
|
_v2_reasoning_collected.append(response_text)
|
|
708
|
-
_emitted_reasoning_this_iter = True
|
|
709
633
|
await self._emit_v2_event(
|
|
710
634
|
"v2_reasoning",
|
|
711
635
|
{"content": response_text},
|
|
@@ -791,21 +715,6 @@ class MainAgent(BaseAgent):
|
|
|
791
715
|
except Exception as e:
|
|
792
716
|
logger.warning(f"[{task_id}] 存入知识库失败: {e}")
|
|
793
717
|
|
|
794
|
-
# Step 6.6: [v1.15.8] 处理 mainsubject — 自动命名会话标题
|
|
795
|
-
if parsed.mainsubject and _history_user_msg_count < 4:
|
|
796
|
-
try:
|
|
797
|
-
subject = parsed.mainsubject.strip()[:20] # 安全截断
|
|
798
|
-
if self.memory:
|
|
799
|
-
self.memory.rename_session(context.session_id, subject)
|
|
800
|
-
logger.info(f"[{task_id}] 会话自动命名: {subject}")
|
|
801
|
-
await self._emit_v2_event(
|
|
802
|
-
"v2_session_rename",
|
|
803
|
-
{"session_id": context.session_id, "name": subject},
|
|
804
|
-
stream_callback,
|
|
805
|
-
)
|
|
806
|
-
except Exception as e:
|
|
807
|
-
logger.warning(f"[{task_id}] 会话自动命名失败: {e}")
|
|
808
|
-
|
|
809
718
|
# Step 7: 处理 recall — 记录下一轮需要检索的记忆内容
|
|
810
719
|
if parsed.recall:
|
|
811
720
|
recall_content = parsed.recall
|
|
@@ -848,22 +757,31 @@ class MainAgent(BaseAgent):
|
|
|
848
757
|
|
|
849
758
|
# Step 10: 执行工具调用(无论 finish 值如何,先执行工具)
|
|
850
759
|
if not parsed.tools_to_call:
|
|
851
|
-
# 无工具调用:
|
|
852
|
-
if
|
|
853
|
-
|
|
854
|
-
else:
|
|
760
|
+
# 无工具调用: 直接根据 finish 判断是否结束
|
|
761
|
+
if parsed.finish:
|
|
762
|
+
logger.info(f"[{task_id}] finish=true 且无工具调用,结束循环")
|
|
855
763
|
before, after = extract_surrounding_text(llm_raw)
|
|
856
764
|
final_text = (before + "\n" + after).strip() if (before.strip() or after.strip()) else "任务已完成。"
|
|
857
|
-
|
|
858
|
-
# [v1.15.8] 跳过已发送的 reasoning 文本,避免 TTS 重复播报
|
|
859
|
-
if not _emitted_reasoning_this_iter:
|
|
765
|
+
context.working_memory["final_response"] = final_text
|
|
860
766
|
await self._emit_v2_event("v2_reasoning", {"content": truncate_str(final_text, 3000)}, stream_callback)
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
767
|
+
if self.memory:
|
|
768
|
+
self.memory.add_session(
|
|
769
|
+
session_id=context.session_id,
|
|
770
|
+
role="assistant",
|
|
771
|
+
content=final_text,
|
|
772
|
+
)
|
|
773
|
+
else:
|
|
774
|
+
logger.info(f"[{task_id}] 无工具调用且 finish=false,结束")
|
|
775
|
+
before, after = extract_surrounding_text(llm_raw)
|
|
776
|
+
final_text = (before + "\n" + after).strip() if (before.strip() or after.strip()) else "处理完毕。"
|
|
777
|
+
context.working_memory["final_response"] = final_text
|
|
778
|
+
await self._emit_v2_event("v2_reasoning", {"content": truncate_str(final_text, 3000)}, stream_callback)
|
|
779
|
+
if self.memory:
|
|
780
|
+
self.memory.add_session(
|
|
781
|
+
session_id=context.session_id,
|
|
782
|
+
role="assistant",
|
|
783
|
+
content=final_text,
|
|
784
|
+
)
|
|
867
785
|
break
|
|
868
786
|
|
|
869
787
|
# Step 11: 有工具调用 — 先执行所有工具,再根据 finish 决定回调
|
|
@@ -886,7 +804,6 @@ class MainAgent(BaseAgent):
|
|
|
886
804
|
# 发送 beforecalltext 作为显示文本
|
|
887
805
|
if before_call:
|
|
888
806
|
_v2_reasoning_collected.append(before_call)
|
|
889
|
-
_emitted_reasoning_this_iter = True
|
|
890
807
|
await self._emit_v2_event(
|
|
891
808
|
"v2_reasoning",
|
|
892
809
|
{"content": before_call},
|
|
@@ -898,7 +815,6 @@ class MainAgent(BaseAgent):
|
|
|
898
815
|
"v2_tool_start",
|
|
899
816
|
{"tool": {
|
|
900
817
|
"toolname": tool_name,
|
|
901
|
-
"beforecalltext": before_call,
|
|
902
818
|
"parms": truncate_str(parms, 500),
|
|
903
819
|
"timeout": timeout,
|
|
904
820
|
"callback": should_callback,
|
|
@@ -1070,8 +986,15 @@ class MainAgent(BaseAgent):
|
|
|
1070
986
|
# 数据密集型工具允许更长的输出
|
|
1071
987
|
_HEAVY_TOOLS = ("web_search", "web_read", "url_read", "file_list",
|
|
1072
988
|
"file_search", "browser_open", "process_list")
|
|
989
|
+
# OpenClaw prompt-only 技能也允许较长输出(SKILL.md 指令)
|
|
990
|
+
_is_openclaw = (
|
|
991
|
+
isinstance(tool_result.get("data"), dict)
|
|
992
|
+
and tool_result.get("data", {}).get("skill_type") == "openclaw"
|
|
993
|
+
)
|
|
1073
994
|
if tool_name in _HEAVY_TOOLS:
|
|
1074
995
|
_max_output = 6000
|
|
996
|
+
elif _is_openclaw:
|
|
997
|
+
_max_output = 8000
|
|
1075
998
|
else:
|
|
1076
999
|
_max_output = 3000
|
|
1077
1000
|
tool_outputs_parts.append(
|
|
@@ -1092,12 +1015,10 @@ class MainAgent(BaseAgent):
|
|
|
1092
1015
|
|
|
1093
1016
|
# 保存工具调用到会话记忆
|
|
1094
1017
|
if self.memory:
|
|
1095
|
-
# 构建工具调用记录,包含 beforecalltext 作为标题
|
|
1096
|
-
tool_call_title = before_call if before_call else f"调用工具: {tool_name}"
|
|
1097
1018
|
self.memory.add_session(
|
|
1098
1019
|
session_id=context.session_id,
|
|
1099
1020
|
role="assistant",
|
|
1100
|
-
content=f"
|
|
1021
|
+
content=f"调用工具: {tool_name}\n参数: {truncate_str(parms, 1000)}",
|
|
1101
1022
|
key="tool_call",
|
|
1102
1023
|
importance=0.4,
|
|
1103
1024
|
)
|
|
@@ -1132,9 +1053,7 @@ class MainAgent(BaseAgent):
|
|
|
1132
1053
|
if current_task_plan:
|
|
1133
1054
|
final_text += f"\n\n任务计划:\n{current_task_plan}"
|
|
1134
1055
|
context.working_memory["final_response"] = final_text
|
|
1135
|
-
|
|
1136
|
-
if not _emitted_reasoning_this_iter:
|
|
1137
|
-
await self._emit_v2_event("v2_reasoning", {"content": truncate_str(final_text, 3000)}, stream_callback)
|
|
1056
|
+
await self._emit_v2_event("v2_reasoning", {"content": truncate_str(final_text, 3000)}, stream_callback)
|
|
1138
1057
|
if self.memory:
|
|
1139
1058
|
self.memory.add_session(
|
|
1140
1059
|
session_id=context.session_id,
|
|
@@ -1161,9 +1080,7 @@ class MainAgent(BaseAgent):
|
|
|
1161
1080
|
if current_task_plan:
|
|
1162
1081
|
final_text += f"\n\n任务计划:\n{current_task_plan}"
|
|
1163
1082
|
context.working_memory["final_response"] = final_text
|
|
1164
|
-
|
|
1165
|
-
if not _emitted_reasoning_this_iter:
|
|
1166
|
-
await self._emit_v2_event("v2_reasoning", {"content": truncate_str(final_text, 3000)}, stream_callback)
|
|
1083
|
+
await self._emit_v2_event("v2_reasoning", {"content": truncate_str(final_text, 3000)}, stream_callback)
|
|
1167
1084
|
if self.memory:
|
|
1168
1085
|
self.memory.add_session(
|
|
1169
1086
|
session_id=context.session_id,
|
|
@@ -1256,34 +1173,6 @@ class MainAgent(BaseAgent):
|
|
|
1256
1173
|
else:
|
|
1257
1174
|
result["error"] = "执行引擎未初始化"
|
|
1258
1175
|
|
|
1259
|
-
elif tool_name == "recall_memory":
|
|
1260
|
-
# === 主动召回记忆工具 ===
|
|
1261
|
-
# 根据 memory_agent.recall_memory() 搜索历史记忆
|
|
1262
|
-
try:
|
|
1263
|
-
if self.memory_agent:
|
|
1264
|
-
recall_results = await self.memory_agent.recall_memory(
|
|
1265
|
-
keyword=params.get("keyword", ""),
|
|
1266
|
-
time_point=params.get("time_point", ""),
|
|
1267
|
-
session_id=params.get("session_id", ""),
|
|
1268
|
-
limit=params.get("limit", 5),
|
|
1269
|
-
)
|
|
1270
|
-
if recall_results:
|
|
1271
|
-
output_lines = [f"找到 {len(recall_results)} 条相关记忆:"]
|
|
1272
|
-
for i, mem in enumerate(recall_results, 1):
|
|
1273
|
-
output_lines.append(
|
|
1274
|
-
f"{i}. [{mem.get('created_at', '')}] "
|
|
1275
|
-
f"[{mem.get('category', '')}] "
|
|
1276
|
-
f"{mem.get('content', '')}"
|
|
1277
|
-
)
|
|
1278
|
-
result = {"success": True, "output": "\n".join(output_lines), "data": recall_results}
|
|
1279
|
-
else:
|
|
1280
|
-
result = {"success": True, "output": "未找到相关记忆", "data": []}
|
|
1281
|
-
else:
|
|
1282
|
-
result = {"success": False, "error": "记忆系统未初始化"}
|
|
1283
|
-
except Exception as re_err:
|
|
1284
|
-
result = {"success": False, "error": f"记忆召回失败: {re_err}"}
|
|
1285
|
-
logger.warning(f"[{task_id}] recall_memory 工具异常: {re_err}")
|
|
1286
|
-
|
|
1287
1176
|
elif self.skills:
|
|
1288
1177
|
exec_result = await self.skills.execute(tool_name, **params)
|
|
1289
1178
|
result = exec_result.to_dict()
|
package/agents/memory_agent.py
CHANGED
|
@@ -306,14 +306,14 @@ class MemoryAgent(BaseAgent):
|
|
|
306
306
|
|
|
307
307
|
context.working_memory["relevant_memories"] = {
|
|
308
308
|
"global": [
|
|
309
|
-
{"content": e.content, "key": e.key, "summary": e.summary}
|
|
309
|
+
{"content": e.content[:500], "key": e.key, "summary": e.summary}
|
|
310
310
|
for e in global_memories
|
|
311
311
|
],
|
|
312
312
|
"error_patterns": [
|
|
313
|
-
{"content": e.content} for e in errors
|
|
313
|
+
{"content": e.content[:300]} for e in errors
|
|
314
314
|
],
|
|
315
315
|
"preferences": [
|
|
316
|
-
{"content": e.content} for e in prefs[-5:]
|
|
316
|
+
{"content": e.content[:200]} for e in prefs[-5:]
|
|
317
317
|
],
|
|
318
318
|
}
|
|
319
319
|
|
|
@@ -325,99 +325,11 @@ class MemoryAgent(BaseAgent):
|
|
|
325
325
|
|
|
326
326
|
if errors:
|
|
327
327
|
context_parts.append("\n## 历史错误(避免重复)")
|
|
328
|
-
context_parts.extend(f"- {e.content}" for e in errors)
|
|
328
|
+
context_parts.extend(f"- {e.content[:200]}" for e in errors)
|
|
329
329
|
|
|
330
330
|
if global_memories:
|
|
331
331
|
context_parts.append("\n## 相关经验")
|
|
332
|
-
context_parts.extend(f"- {e.summary or e.content}" for e in global_memories)
|
|
332
|
+
context_parts.extend(f"- {e.summary or e.content[:200]}" for e in global_memories)
|
|
333
333
|
|
|
334
334
|
if context_parts:
|
|
335
335
|
context.working_memory["memory_context_prompt"] = "\n".join(context_parts)
|
|
336
|
-
|
|
337
|
-
async def recall_memory(
|
|
338
|
-
self,
|
|
339
|
-
keyword: str = "",
|
|
340
|
-
time_point: str = "",
|
|
341
|
-
session_id: str = "",
|
|
342
|
-
limit: int = 5,
|
|
343
|
-
) -> list:
|
|
344
|
-
"""
|
|
345
|
-
主动召回记忆 —— 根据关键字和时间点搜索历史记忆。
|
|
346
|
-
|
|
347
|
-
这是供大模型通过 <recall> 标签调用的工具方法。
|
|
348
|
-
搜索范围包括全局记忆和会话记忆。
|
|
349
|
-
|
|
350
|
-
Args:
|
|
351
|
-
keyword: 搜索关键字(必填,用于模糊匹配和语义搜索)
|
|
352
|
-
time_point: 时间参考点(可选),格式如 "2025-01" 或 "2025-01-15"
|
|
353
|
-
系统会将其转换为 start_time 进行时间范围过滤
|
|
354
|
-
session_id: 会话 ID(可选,为空则跨会话搜索)
|
|
355
|
-
limit: 返回数量(默认 5)
|
|
356
|
-
|
|
357
|
-
Returns:
|
|
358
|
-
匹配的记忆列表,每项包含 content, created_at, key, category
|
|
359
|
-
"""
|
|
360
|
-
if not self.memory:
|
|
361
|
-
return []
|
|
362
|
-
|
|
363
|
-
# 解析 time_point 为 start_time
|
|
364
|
-
start_time = ""
|
|
365
|
-
if time_point:
|
|
366
|
-
# 支持多种格式: "2025-01", "2025-01-15", "2025年1月"
|
|
367
|
-
import re as _re
|
|
368
|
-
# 尝试 "YYYY年MM月" 格式
|
|
369
|
-
m = _re.match(r"(\d{4})年(\d{1,2})月", time_point)
|
|
370
|
-
if m:
|
|
371
|
-
start_time = f"{m.group(1)}-{int(m.group(2)):02d}-01 00:00:00"
|
|
372
|
-
else:
|
|
373
|
-
# 尝试 "YYYY-MM" 或 "YYYY-MM-DD"
|
|
374
|
-
m = _re.match(r"(\d{4})-(\d{1,2})(?:-(\d{1,2}))?", time_point)
|
|
375
|
-
if m:
|
|
376
|
-
year = m.group(1)
|
|
377
|
-
month = int(m.group(2))
|
|
378
|
-
day = m.group(3)
|
|
379
|
-
if day:
|
|
380
|
-
start_time = f"{year}-{month:02d}-{int(day):02d} 00:00:00"
|
|
381
|
-
else:
|
|
382
|
-
start_time = f"{year}-{month:02d}-01 00:00:00"
|
|
383
|
-
|
|
384
|
-
# 使用 search_by_time_range 进行精确搜索
|
|
385
|
-
if start_time or keyword:
|
|
386
|
-
results = self.memory.search_by_time_range(
|
|
387
|
-
session_id=session_id,
|
|
388
|
-
start_time=start_time,
|
|
389
|
-
keyword=keyword,
|
|
390
|
-
limit=limit,
|
|
391
|
-
)
|
|
392
|
-
if results:
|
|
393
|
-
return [
|
|
394
|
-
{
|
|
395
|
-
"content": e.content,
|
|
396
|
-
"created_at": e.created_at,
|
|
397
|
-
"key": e.key,
|
|
398
|
-
"category": e.category,
|
|
399
|
-
"summary": e.summary,
|
|
400
|
-
}
|
|
401
|
-
for e in results
|
|
402
|
-
]
|
|
403
|
-
|
|
404
|
-
# 回退到普通搜索
|
|
405
|
-
if keyword:
|
|
406
|
-
results = self.memory.search(
|
|
407
|
-
query=keyword,
|
|
408
|
-
session_id=session_id,
|
|
409
|
-
limit=limit,
|
|
410
|
-
mode="hybrid",
|
|
411
|
-
)
|
|
412
|
-
return [
|
|
413
|
-
{
|
|
414
|
-
"content": e.content,
|
|
415
|
-
"created_at": e.created_at,
|
|
416
|
-
"key": e.key,
|
|
417
|
-
"category": e.category,
|
|
418
|
-
"summary": e.summary,
|
|
419
|
-
}
|
|
420
|
-
for e in results
|
|
421
|
-
]
|
|
422
|
-
|
|
423
|
-
return []
|
package/config.py
CHANGED
|
@@ -45,7 +45,7 @@ class LLMConfig:
|
|
|
45
45
|
class MemoryConfig:
|
|
46
46
|
"""记忆系统配置"""
|
|
47
47
|
db_path: str = "" # SQLite 数据库路径,默认 ~/.myagent/memory.db
|
|
48
|
-
max_session: int =
|
|
48
|
+
max_session: int = 50 # 会话记忆最大对话轮数
|
|
49
49
|
max_working: int = 100 # 任务进度最大条数
|
|
50
50
|
auto_summarize: bool = True # 自动总结开关
|
|
51
51
|
summarize_threshold: int = 20 # 触发总结的对话轮数
|
|
@@ -100,7 +100,6 @@ class ModelEntry:
|
|
|
100
100
|
input_modes: List[str] = field(default_factory=lambda: ["text"]) # 支持的输入模式: text, image, video, audio
|
|
101
101
|
reasoning: bool = True # 是否支持推理(如 o1 系列)
|
|
102
102
|
enabled: bool = True
|
|
103
|
-
is_global_fallback: bool = True # 是否作为全局兜底模型(保障系统运行的最终兜底模型)
|
|
104
103
|
|
|
105
104
|
|
|
106
105
|
@dataclass
|