Please enter the commit message for your changes. Lines starting
with '#' will be ignored, and an empty message aborts the commit. On branch main Your branch is up to date with 'origin/main'. Changes to be committed: new file: .claude/skills/algorithmic-art/.openskills.json new file: .claude/skills/algorithmic-art/LICENSE.txt new file: .claude/skills/algorithmic-art/SKILL.md new file: .claude/skills/algorithmic-art/templates/generator_template.js new file: .claude/skills/algorithmic-art/templates/viewer.html new file: .claude/skills/brand-guidelines/.openskills.json new file: .claude/skills/brand-guidelines/LICENSE.txt new file: .claude/skills/brand-guidelines/SKILL.md new file: .claude/skills/canvas-design/.openskills.json new file: .claude/skills/canvas-design/LICENSE.txt new file: .claude/skills/canvas-design/SKILL.md new file: .claude/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf new file: .claude/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf new file: .claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf new file: .claude/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf new file: .claude/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/DMMono-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf new file: .claude/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/Gloock-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf new file: .claude/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf new file: .claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf new file: .claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf new file: .claude/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf new file: .claude/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf new file: .claude/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf new file: .claude/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf new file: .claude/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/Italiana-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf new file: .claude/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/Jura-Light.ttf new file: .claude/skills/canvas-design/canvas-fonts/Jura-Medium.ttf new file: .claude/skills/canvas-design/canvas-fonts/Jura-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/Lora-Bold.ttf new file: .claude/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf new file: .claude/skills/canvas-design/canvas-fonts/Lora-Italic.ttf new file: .claude/skills/canvas-design/canvas-fonts/Lora-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/Lora-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf new file: .claude/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf new file: .claude/skills/canvas-design/canvas-fonts/Outfit-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf new file: .claude/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf new file: .claude/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf new file: .claude/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf new file: .claude/skills/canvas-design/canvas-fonts/Tektur-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf new file: .claude/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf new file: .claude/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf new file: .claude/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf new file: .claude/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt new file: .claude/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf new file: .claude/skills/doc-coauthoring/.openskills.json new file: .claude/skills/doc-coauthoring/SKILL.md new file: .claude/skills/docx/.openskills.json new file: .claude/skills/docx/LICENSE.txt new file: .claude/skills/docx/SKILL.md new file: .claude/skills/docx/scripts/__init__.py new file: .claude/skills/docx/scripts/accept_changes.py new file: .claude/skills/docx/scripts/comment.py new file: .claude/skills/docx/scripts/office/helpers/__init__.py new file: .claude/skills/docx/scripts/office/helpers/merge_runs.py new file: .claude/skills/docx/scripts/office/helpers/simplify_redlines.py new file: .claude/skills/docx/scripts/office/pack.py new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd new file: .claude/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd new file: .claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd new file: .claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd new file: .claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd new file: .claude/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd new file: .claude/skills/docx/scripts/office/schemas/mce/mc.xsd new file: .claude/skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd new file: .claude/skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd new file: .claude/skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd new file: .claude/skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd new file: .claude/skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd new file: .claude/skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd new file: .claude/skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd new file: .claude/skills/docx/scripts/office/soffice.py new file: .claude/skills/docx/scripts/office/unpack.py new file: .claude/skills/docx/scripts/office/validate.py new file: .claude/skills/docx/scripts/office/validators/__init__.py new file: .claude/skills/docx/scripts/office/validators/base.py new file: .claude/skills/docx/scripts/office/validators/docx.py new file: .claude/skills/docx/scripts/office/validators/pptx.py new file: .claude/skills/docx/scripts/office/validators/redlining.py new file: .claude/skills/docx/scripts/templates/comments.xml new file: .claude/skills/docx/scripts/templates/commentsExtended.xml new file: .claude/skills/docx/scripts/templates/commentsExtensible.xml new file: .claude/skills/docx/scripts/templates/commentsIds.xml new file: .claude/skills/docx/scripts/templates/people.xml new file: .claude/skills/frontend-design/.openskills.json new file: .claude/skills/frontend-design/LICENSE.txt new file: .claude/skills/frontend-design/SKILL.md new file: .claude/skills/internal-comms/.openskills.json new file: .claude/skills/internal-comms/LICENSE.txt new file: .claude/skills/internal-comms/SKILL.md new file: .claude/skills/internal-comms/examples/3p-updates.md new file: .claude/skills/internal-comms/examples/company-newsletter.md new file: .claude/skills/internal-comms/examples/faq-answers.md new file: .claude/skills/internal-comms/examples/general-comms.md new file: .claude/skills/mcp-builder/.openskills.json new file: .claude/skills/mcp-builder/LICENSE.txt new file: .claude/skills/mcp-builder/SKILL.md new file: .claude/skills/mcp-builder/reference/evaluation.md new file: .claude/skills/mcp-builder/reference/mcp_best_practices.md new file: .claude/skills/mcp-builder/reference/node_mcp_server.md new file: .claude/skills/mcp-builder/reference/python_mcp_server.md new file: .claude/skills/mcp-builder/scripts/connections.py new file: .claude/skills/mcp-builder/scripts/evaluation.py new file: .claude/skills/mcp-builder/scripts/example_evaluation.xml new file: .claude/skills/mcp-builder/scripts/requirements.txt new file: .claude/skills/pdf/.openskills.json new file: .claude/skills/pdf/LICENSE.txt new file: .claude/skills/pdf/SKILL.md new file: .claude/skills/pdf/forms.md new file: .claude/skills/pdf/reference.md new file: .claude/skills/pdf/scripts/check_bounding_boxes.py new file: .claude/skills/pdf/scripts/check_fillable_fields.py new file: .claude/skills/pdf/scripts/convert_pdf_to_images.py new file: .claude/skills/pdf/scripts/create_validation_image.py new file: .claude/skills/pdf/scripts/extract_form_field_info.py new file: .claude/skills/pdf/scripts/extract_form_structure.py new file: .claude/skills/pdf/scripts/fill_fillable_fields.py new file: .claude/skills/pdf/scripts/fill_pdf_form_with_annotations.py new file: .claude/skills/pptx/.openskills.json new file: .claude/skills/pptx/LICENSE.txt new file: .claude/skills/pptx/SKILL.md new file: .claude/skills/pptx/editing.md new file: .claude/skills/pptx/pptxgenjs.md new file: .claude/skills/pptx/scripts/__init__.py new file: .claude/skills/pptx/scripts/add_slide.py new file: .claude/skills/pptx/scripts/clean.py new file: .claude/skills/pptx/scripts/office/helpers/__init__.py new file: .claude/skills/pptx/scripts/office/helpers/merge_runs.py new file: .claude/skills/pptx/scripts/office/helpers/simplify_redlines.py new file: .claude/skills/pptx/scripts/office/pack.py new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd new file: .claude/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd new file: .claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd new file: .claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd new file: .claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd new file: .claude/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd new file: .claude/skills/pptx/scripts/office/schemas/mce/mc.xsd new file: .claude/skills/pptx/scripts/office/schemas/microsoft/wml-2010.xsd new file: .claude/skills/pptx/scripts/office/schemas/microsoft/wml-2012.xsd new file: .claude/skills/pptx/scripts/office/schemas/microsoft/wml-2018.xsd new file: .claude/skills/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd new file: .claude/skills/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd new file: .claude/skills/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd new file: .claude/skills/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd new file: .claude/skills/pptx/scripts/office/soffice.py new file: .claude/skills/pptx/scripts/office/unpack.py new file: .claude/skills/pptx/scripts/office/validate.py new file: .claude/skills/pptx/scripts/office/validators/__init__.py new file: .claude/skills/pptx/scripts/office/validators/base.py new file: .claude/skills/pptx/scripts/office/validators/docx.py new file: .claude/skills/pptx/scripts/office/validators/pptx.py new file: .claude/skills/pptx/scripts/office/validators/redlining.py new file: .claude/skills/pptx/scripts/thumbnail.py new file: .claude/skills/skill-creator/.openskills.json new file: .claude/skills/skill-creator/LICENSE.txt new file: .claude/skills/skill-creator/SKILL.md new file: .claude/skills/skill-creator/agents/analyzer.md new file: .claude/skills/skill-creator/agents/comparator.md new file: .claude/skills/skill-creator/agents/grader.md new file: .claude/skills/skill-creator/assets/eval_review.html new file: .claude/skills/skill-creator/eval-viewer/generate_review.py new file: .claude/skills/skill-creator/eval-viewer/viewer.html new file: .claude/skills/skill-creator/references/schemas.md new file: .claude/skills/skill-creator/scripts/__init__.py new file: .claude/skills/skill-creator/scripts/aggregate_benchmark.py new file: .claude/skills/skill-creator/scripts/generate_report.py new file: .claude/skills/skill-creator/scripts/improve_description.py new file: .claude/skills/skill-creator/scripts/package_skill.py new file: .claude/skills/skill-creator/scripts/quick_validate.py new file: .claude/skills/skill-creator/scripts/run_eval.py new file: .claude/skills/skill-creator/scripts/run_loop.py new file: .claude/skills/skill-creator/scripts/utils.py new file: .claude/skills/slack-gif-creator/.openskills.json new file: .claude/skills/slack-gif-creator/LICENSE.txt new file: .claude/skills/slack-gif-creator/SKILL.md new file: .claude/skills/slack-gif-creator/core/easing.py new file: .claude/skills/slack-gif-creator/core/frame_composer.py new file: .claude/skills/slack-gif-creator/core/gif_builder.py new file: .claude/skills/slack-gif-creator/core/validators.py new file: .claude/skills/slack-gif-creator/requirements.txt new file: .claude/skills/template/.openskills.json new file: .claude/skills/template/SKILL.md new file: .claude/skills/theme-factory/.openskills.json new file: .claude/skills/theme-factory/LICENSE.txt new file: .claude/skills/theme-factory/SKILL.md new file: .claude/skills/theme-factory/theme-showcase.pdf new file: .claude/skills/theme-factory/themes/arctic-frost.md new file: .claude/skills/theme-factory/themes/botanical-garden.md new file: .claude/skills/theme-factory/themes/desert-rose.md new file: .claude/skills/theme-factory/themes/forest-canopy.md new file: .claude/skills/theme-factory/themes/golden-hour.md new file: .claude/skills/theme-factory/themes/midnight-galaxy.md new file: .claude/skills/theme-factory/themes/modern-minimalist.md new file: .claude/skills/theme-factory/themes/ocean-depths.md new file: .claude/skills/theme-factory/themes/sunset-boulevard.md new file: .claude/skills/theme-factory/themes/tech-innovation.md new file: .claude/skills/web-artifacts-builder/.openskills.json new file: .claude/skills/web-artifacts-builder/LICENSE.txt new file: .claude/skills/web-artifacts-builder/SKILL.md new file: .claude/skills/web-artifacts-builder/scripts/bundle-artifact.sh new file: .claude/skills/web-artifacts-builder/scripts/init-artifact.sh new file: .claude/skills/web-artifacts-builder/scripts/shadcn-components.tar.gz new file: .claude/skills/webapp-testing/.openskills.json new file: .claude/skills/webapp-testing/LICENSE.txt new file: .claude/skills/webapp-testing/SKILL.md new file: .claude/skills/webapp-testing/examples/console_logging.py new file: .claude/skills/webapp-testing/examples/element_discovery.py new file: .claude/skills/webapp-testing/examples/static_html_automation.py new file: .claude/skills/webapp-testing/scripts/with_server.py new file: .claude/skills/xlsx/.openskills.json new file: .claude/skills/xlsx/LICENSE.txt new file: .claude/skills/xlsx/SKILL.md new file: .claude/skills/xlsx/scripts/office/helpers/__init__.py new file: .claude/skills/xlsx/scripts/office/helpers/merge_runs.py new file: .claude/skills/xlsx/scripts/office/helpers/simplify_redlines.py new file: .claude/skills/xlsx/scripts/office/pack.py new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd new file: .claude/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd new file: .claude/skills/xlsx/scripts/office/schemas/mce/mc.xsd new file: .claude/skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd new file: .claude/skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd new file: .claude/skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd new file: .claude/skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd new file: .claude/skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd new file: .claude/skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd new file: .claude/skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd new file: .claude/skills/xlsx/scripts/office/soffice.py new file: .claude/skills/xlsx/scripts/office/unpack.py new file: .claude/skills/xlsx/scripts/office/validate.py new file: .claude/skills/xlsx/scripts/office/validators/__init__.py new file: .claude/skills/xlsx/scripts/office/validators/base.py new file: .claude/skills/xlsx/scripts/office/validators/docx.py new file: .claude/skills/xlsx/scripts/office/validators/pptx.py new file: .claude/skills/xlsx/scripts/office/validators/redlining.py new file: .claude/skills/xlsx/scripts/recalc.py new file: .env.example new file: .gitignore new file: config/mcp.json new file: config/models.json new file: config/personalities.json new file: docs/AGENTS.md new file: docs/AI_IMPLEMENTATION.md new file: docs/AI_INTEGRATION_COMPLETE.md new file: docs/AI_QUICKSTART.md new file: docs/AI_SUMMARY.md new file: docs/CHANGELOG.md new file: docs/CONFIG_GUIDE.md new file: docs/FIXES.md new file: docs/PROJECT_REFACTOR.md new file: docs/README.md new file: docs/README_INDEX.md new file: examples/ai_example.py new file: main.py new file: pytest.ini new file: requirements.txt new file: scripts/migrate_to_vector_db.py new file: skills/cmd_zip_skill/README.md new file: skills/cmd_zip_skill/__init__.py new file: skills/cmd_zip_skill/main.py new file: skills/cmd_zip_skill/skill.json new file: skills/cmd_zip_skill_1772465404375/README.md new file: skills/cmd_zip_skill_1772465404375/__init__.py new file: skills/cmd_zip_skill_1772465404375/main.py new file: skills/cmd_zip_skill_1772465404375/skill.json new file: skills/cmd_zip_skill_1772465434774/README.md new file: skills/cmd_zip_skill_1772465434774/__init__.py new file: skills/cmd_zip_skill_1772465434774/main.py new file: skills/cmd_zip_skill_1772465434774/skill.json new file: skills/cmd_zip_skill_1772465467809/README.md new file: skills/cmd_zip_skill_1772465467809/__init__.py new file: skills/cmd_zip_skill_1772465467809/main.py new file: skills/cmd_zip_skill_1772465467809/skill.json new file: skills/cmd_zip_skill_1772465652075/README.md new file: skills/cmd_zip_skill_1772465652075/__init__.py new file: skills/cmd_zip_skill_1772465652075/main.py new file: skills/cmd_zip_skill_1772465652075/skill.json new file: skills/cmd_zip_skill_1772465685352/README.md new file: skills/cmd_zip_skill_1772465685352/__init__.py new file: skills/cmd_zip_skill_1772465685352/main.py new file: skills/cmd_zip_skill_1772465685352/skill.json new file: skills/cmd_zip_skill_1772465936294/README.md new file: skills/cmd_zip_skill_1772465936294/__init__.py new file: skills/cmd_zip_skill_1772465936294/main.py new file: skills/cmd_zip_skill_1772465936294/skill.json new file: skills/cmd_zip_skill_1772465966322/README.md new file: skills/cmd_zip_skill_1772465966322/__init__.py new file: skills/cmd_zip_skill_1772465966322/main.py new file: skills/cmd_zip_skill_1772465966322/skill.json new file: skills/cmd_zip_skill_1772466071278/README.md new file: skills/cmd_zip_skill_1772466071278/__init__.py new file: skills/cmd_zip_skill_1772466071278/main.py new file: skills/cmd_zip_skill_1772466071278/skill.json new file: skills/skills_creator/README.md new file: skills/skills_creator/__init__.py new file: skills/skills_creator/main.py new file: skills/skills_creator/skill.json new file: src/__init__.py new file: src/ai/__init__.py new file: src/ai/base.py new file: src/ai/client.py new file: src/ai/docs/README.md new file: src/ai/mcp/__init__.py new file: src/ai/mcp/base.py new file: src/ai/mcp/servers/__init__.py new file: src/ai/mcp/servers/filesystem.py new file: src/ai/memory.py new file: src/ai/models/__init__.py new file: src/ai/models/anthropic_model.py new file: src/ai/models/openai_model.py new file: src/ai/personality.py new file: src/ai/skills/__init__.py new file: src/ai/skills/base.py new file: src/ai/task_manager.py new file: src/ai/vector_store/__init__.py new file: src/ai/vector_store/base.py new file: src/ai/vector_store/chroma_store.py new file: src/ai/vector_store/json_store.py new file: src/core/__init__.py new file: src/core/bot.py new file: src/core/config.py new file: src/handlers/__init__.py new file: src/handlers/message_handler.py new file: src/handlers/message_handler_ai.py new file: src/utils/__init__.py new file: src/utils/logger.py new file: start.bat new file: tests/test_ai.py
This commit is contained in:
130
docs/AGENTS.md
Normal file
130
docs/AGENTS.md
Normal file
@@ -0,0 +1,130 @@
|
||||
# AGENTS
|
||||
|
||||
<skills_system priority="1">
|
||||
|
||||
## Available Skills
|
||||
|
||||
<!-- SKILLS_TABLE_START -->
|
||||
<usage>
|
||||
When users ask you to perform tasks, check if any of the available skills below can help complete the task more effectively. Skills provide specialized capabilities and domain knowledge.
|
||||
|
||||
How to use skills:
|
||||
- Invoke: `npx openskills read <skill-name>` (run in your shell)
|
||||
- For multiple: `npx openskills read skill-one,skill-two`
|
||||
- The skill content will load with detailed instructions on how to complete the task
|
||||
- Base directory provided in output for resolving bundled resources (references/, scripts/, assets/)
|
||||
|
||||
Usage notes:
|
||||
- Only use skills listed in <available_skills> below
|
||||
- Do not invoke a skill that is already loaded in your context
|
||||
- Each skill invocation is stateless
|
||||
</usage>
|
||||
|
||||
<available_skills>
|
||||
|
||||
<skill>
|
||||
<name>algorithmic-art</name>
|
||||
<description>Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.</description>
|
||||
<location>project</location>
|
||||
</skill>
|
||||
|
||||
<skill>
|
||||
<name>brand-guidelines</name>
|
||||
<description>Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.</description>
|
||||
<location>project</location>
|
||||
</skill>
|
||||
|
||||
<skill>
|
||||
<name>canvas-design</name>
|
||||
<description>Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.</description>
|
||||
<location>project</location>
|
||||
</skill>
|
||||
|
||||
<skill>
|
||||
<name>doc-coauthoring</name>
|
||||
<description>Guide users through a structured workflow for co-authoring documentation. Use when user wants to write documentation, proposals, technical specs, decision docs, or similar structured content. This workflow helps users efficiently transfer context, refine content through iteration, and verify the doc works for readers. Trigger when user mentions writing docs, creating proposals, drafting specs, or similar documentation tasks.</description>
|
||||
<location>project</location>
|
||||
</skill>
|
||||
|
||||
<skill>
|
||||
<name>docx</name>
|
||||
<description>"Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx files). Triggers include: any mention of 'Word doc', 'word document', '.docx', or requests to produce professional documents with formatting like tables of contents, headings, page numbers, or letterheads. Also use when extracting or reorganizing content from .docx files, inserting or replacing images in documents, performing find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a 'report', 'memo', 'letter', 'template', or similar deliverable as a Word or .docx file, use this skill. Do NOT use for PDFs, spreadsheets, Google Docs, or general coding tasks unrelated to document generation."</description>
|
||||
<location>project</location>
|
||||
</skill>
|
||||
|
||||
<skill>
|
||||
<name>frontend-design</name>
|
||||
<description>Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML/CSS layouts, or when styling/beautifying any web UI). Generates creative, polished code and UI design that avoids generic AI aesthetics.</description>
|
||||
<location>project</location>
|
||||
</skill>
|
||||
|
||||
<skill>
|
||||
<name>internal-comms</name>
|
||||
<description>A set of resources to help me write all kinds of internal communications, using the formats that my company likes to use. Claude should use this skill whenever asked to write some sort of internal communications (status reports, leadership updates, 3P updates, company newsletters, FAQs, incident reports, project updates, etc.).</description>
|
||||
<location>project</location>
|
||||
</skill>
|
||||
|
||||
<skill>
|
||||
<name>mcp-builder</name>
|
||||
<description>Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node/TypeScript (MCP SDK).</description>
|
||||
<location>project</location>
|
||||
</skill>
|
||||
|
||||
<skill>
|
||||
<name>pdf</name>
|
||||
<description>Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill.</description>
|
||||
<location>project</location>
|
||||
</skill>
|
||||
|
||||
<skill>
|
||||
<name>pptx</name>
|
||||
<description>"Use this skill any time a .pptx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations; reading, parsing, or extracting text from any .pptx file (even if the extracted content will be used elsewhere, like in an email or summary); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates, layouts, speaker notes, or comments. Trigger whenever the user mentions \"deck,\" \"slides,\" \"presentation,\" or references a .pptx filename, regardless of what they plan to do with the content afterward. If a .pptx file needs to be opened, created, or touched, use this skill."</description>
|
||||
<location>project</location>
|
||||
</skill>
|
||||
|
||||
<skill>
|
||||
<name>skill-creator</name>
|
||||
<description>Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, update or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy.</description>
|
||||
<location>project</location>
|
||||
</skill>
|
||||
|
||||
<skill>
|
||||
<name>slack-gif-creator</name>
|
||||
<description>Knowledge and utilities for creating animated GIFs optimized for Slack. Provides constraints, validation tools, and animation concepts. Use when users request animated GIFs for Slack like "make me a GIF of X doing Y for Slack."</description>
|
||||
<location>project</location>
|
||||
</skill>
|
||||
|
||||
<skill>
|
||||
<name>template</name>
|
||||
<description>Replace with description of the skill and when Claude should use it.</description>
|
||||
<location>project</location>
|
||||
</skill>
|
||||
|
||||
<skill>
|
||||
<name>theme-factory</name>
|
||||
<description>Toolkit for styling artifacts with a theme. These artifacts can be slides, docs, reportings, HTML landing pages, etc. There are 10 pre-set themes with colors/fonts that you can apply to any artifact that has been creating, or can generate a new theme on-the-fly.</description>
|
||||
<location>project</location>
|
||||
</skill>
|
||||
|
||||
<skill>
|
||||
<name>web-artifacts-builder</name>
|
||||
<description>Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn/ui). Use for complex artifacts requiring state management, routing, or shadcn/ui components - not for simple single-file HTML/JSX artifacts.</description>
|
||||
<location>project</location>
|
||||
</skill>
|
||||
|
||||
<skill>
|
||||
<name>webapp-testing</name>
|
||||
<description>Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.</description>
|
||||
<location>project</location>
|
||||
</skill>
|
||||
|
||||
<skill>
|
||||
<name>xlsx</name>
|
||||
<description>"Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like \"the xlsx in my downloads\") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved."</description>
|
||||
<location>project</location>
|
||||
</skill>
|
||||
|
||||
</available_skills>
|
||||
<!-- SKILLS_TABLE_END -->
|
||||
|
||||
</skills_system>
|
||||
235
docs/AI_IMPLEMENTATION.md
Normal file
235
docs/AI_IMPLEMENTATION.md
Normal file
@@ -0,0 +1,235 @@
|
||||
# QQBot AI功能实现完成 ✅
|
||||
|
||||
## 已实现的功能
|
||||
|
||||
### 1. ✅ AI模型接入
|
||||
- **多模型支持**:OpenAI、Anthropic Claude、DeepSeek、Qwen
|
||||
- **统一接口**:`AIClient` 提供统一的对话接口
|
||||
- **流式响应**:支持流式输出
|
||||
- **工具调用**:支持Function Calling
|
||||
|
||||
**核心文件**:
|
||||
- `src/ai/base.py` - 基础类和接口定义
|
||||
- `src/ai/models/openai_model.py` - OpenAI模型实现
|
||||
- `src/ai/models/anthropic_model.py` - Anthropic模型实现
|
||||
- `src/ai/client.py` - AI客户端统一接口
|
||||
|
||||
### 2. ✅ 人格系统
|
||||
- **预设人格**:默认助手、技术专家、创意伙伴
|
||||
- **自定义人格**:支持定义性格特质、说话风格、示例回复
|
||||
- **动态切换**:运行时切换人格
|
||||
- **持久化**:人格配置保存到JSON文件
|
||||
|
||||
**核心文件**:
|
||||
- `src/ai/personality.py` - 人格系统实现
|
||||
- `config/personalities.json` - 人格配置文件
|
||||
|
||||
### 3. ✅ 记忆系统
|
||||
- **短期记忆**:
|
||||
- 滑动窗口(默认20条)
|
||||
- 自动过期(默认30分钟)
|
||||
- 按用户隔离
|
||||
|
||||
- **长期记忆**:
|
||||
- 重要性评估(基于长度、关键词、元数据)
|
||||
- 持久化存储
|
||||
- 访问统计
|
||||
|
||||
- **RAG检索**:
|
||||
- 向量嵌入
|
||||
- 余弦相似度搜索
|
||||
- 智能上下文组装
|
||||
|
||||
**核心文件**:
|
||||
- `src/ai/memory.py` - 记忆系统实现
|
||||
- `data/ai/long_term_memory.json` - 长期记忆存储
|
||||
|
||||
### 4. ✅ 长任务处理
|
||||
- **任务分解**:将复杂任务分解为多个步骤
|
||||
- **进度跟踪**:实时进度回调
|
||||
- **状态管理**:支持暂停、恢复、取消
|
||||
- **持久化**:任务状态保存到JSON
|
||||
- **动作注册**:灵活的动作处理器系统
|
||||
|
||||
**核心文件**:
|
||||
- `src/ai/task_manager.py` - 长任务管理器
|
||||
- `data/ai/tasks.json` - 任务存储
|
||||
|
||||
### 5. ✅ Skills插件系统
|
||||
- **插件架构**:基于类的插件系统
|
||||
- **热加载**:运行时加载/卸载技能
|
||||
- **工具注册**:技能可注册多个工具
|
||||
- **元数据管理**:skill.json配置文件
|
||||
- **示例技能**:天气查询技能
|
||||
|
||||
**核心文件**:
|
||||
- `src/ai/skills/base.py` - Skills基础框架
|
||||
- `skills/weather/` - 示例天气技能
|
||||
|
||||
### 6. ✅ MCP支持
|
||||
- **标准协议**:Model Context Protocol支持
|
||||
- **服务器架构**:可扩展的MCP服务器
|
||||
- **资源管理**:资源、工具、提示词注册
|
||||
- **文件系统服务器**:内置文件访问MCP服务器
|
||||
|
||||
**核心文件**:
|
||||
- `src/ai/mcp/base.py` - MCP基础框架
|
||||
- `src/ai/mcp/servers/filesystem.py` - 文件系统MCP服务器
|
||||
- `config/mcp.json` - MCP配置
|
||||
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
QQbot/
|
||||
├── src/
|
||||
│ ├── ai/ # AI模块
|
||||
│ │ ├── __init__.py
|
||||
│ │ ├── base.py # 基础类定义
|
||||
│ │ ├── client.py # AI客户端
|
||||
│ │ ├── personality.py # 人格系统
|
||||
│ │ ├── memory.py # 记忆系统
|
||||
│ │ ├── task_manager.py # 长任务管理
|
||||
│ │ ├── models/ # 模型实现
|
||||
│ │ │ ├── openai_model.py
|
||||
│ │ │ └── anthropic_model.py
|
||||
│ │ ├── skills/ # Skills系统
|
||||
│ │ │ ├── base.py
|
||||
│ │ │ └── __init__.py
|
||||
│ │ └── mcp/ # MCP系统
|
||||
│ │ ├── base.py
|
||||
│ │ ├── __init__.py
|
||||
│ │ └── servers/
|
||||
│ │ └── filesystem.py
|
||||
│ ├── handlers/
|
||||
│ │ └── message_handler_ai.py # AI集成的消息处理器
|
||||
│ └── ...
|
||||
├── skills/ # 技能插件目录
|
||||
│ └── weather/ # 示例天气技能
|
||||
│ ├── skill.json
|
||||
│ ├── main.py
|
||||
│ └── README.md
|
||||
├── config/ # 配置文件
|
||||
│ ├── personalities.json # 人格配置
|
||||
│ └── mcp.json # MCP配置
|
||||
├── data/ # 数据目录
|
||||
│ └── ai/ # AI数据
|
||||
│ ├── long_term_memory.json
|
||||
│ └── tasks.json
|
||||
├── examples/ # 示例代码
|
||||
│ └── ai_example.py
|
||||
├── tests/ # 测试
|
||||
│ └── test_ai.py
|
||||
├── requirements-ai.txt # AI依赖
|
||||
├── .env.ai.example # AI配置示例
|
||||
├── AI_QUICKSTART.md # 快速开始指南
|
||||
└── src/ai/README.md # 完整文档
|
||||
```
|
||||
|
||||
## 使用方法
|
||||
|
||||
### 1. 安装依赖
|
||||
|
||||
```bash
|
||||
pip install -r requirements-ai.txt
|
||||
```
|
||||
|
||||
### 2. 配置环境变量
|
||||
|
||||
复制 `.env.ai.example` 到 `.env` 并配置:
|
||||
|
||||
```env
|
||||
AI_PROVIDER=openai
|
||||
AI_MODEL=gpt-4
|
||||
AI_API_KEY=your_api_key_here
|
||||
AI_API_BASE=https://api.openai.com/v1
|
||||
```
|
||||
|
||||
### 3. 使用AI功能
|
||||
|
||||
```python
|
||||
from pathlib import Path
|
||||
from src.ai import AIClient
|
||||
from src.ai.base import ModelConfig, ModelProvider
|
||||
|
||||
# 创建配置
|
||||
config = ModelConfig(
|
||||
provider=ModelProvider.OPENAI,
|
||||
model_name="gpt-4",
|
||||
api_key="your_key",
|
||||
temperature=0.7
|
||||
)
|
||||
|
||||
# 初始化客户端
|
||||
client = AIClient(config, data_dir=Path("data/ai"))
|
||||
|
||||
# 对话
|
||||
response = await client.chat(
|
||||
user_id="user123",
|
||||
user_message="你好",
|
||||
use_memory=True,
|
||||
use_tools=True
|
||||
)
|
||||
```
|
||||
|
||||
### 4. 集成到QQ机器人
|
||||
|
||||
修改 `src/core/bot.py`,使用 `message_handler_ai.py`:
|
||||
|
||||
```python
|
||||
from src.handlers.message_handler_ai import MessageHandler
|
||||
```
|
||||
|
||||
## 测试
|
||||
|
||||
运行测试脚本:
|
||||
|
||||
```bash
|
||||
python tests/test_ai.py
|
||||
```
|
||||
|
||||
运行示例:
|
||||
|
||||
```bash
|
||||
python examples/ai_example.py
|
||||
```
|
||||
|
||||
## 文档
|
||||
|
||||
- **快速开始**:`AI_QUICKSTART.md`
|
||||
- **完整文档**:`src/ai/README.md`
|
||||
- **示例代码**:`examples/ai_example.py`
|
||||
|
||||
## 特性亮点
|
||||
|
||||
1. **模块化设计**:各功能模块独立,易于维护和扩展
|
||||
2. **异步支持**:全异步实现,性能优秀
|
||||
3. **类型提示**:完整的类型注解,IDE友好
|
||||
4. **错误处理**:完善的异常处理和日志记录
|
||||
5. **可扩展性**:Skills和MCP系统支持无限扩展
|
||||
6. **持久化**:记忆和任务自动保存
|
||||
7. **用户隔离**:多用户数据完全隔离
|
||||
|
||||
## 下一步
|
||||
|
||||
1. **接入真实API**:配置真实的API密钥
|
||||
2. **开发自定义技能**:根据需求开发专属技能
|
||||
3. **优化人格**:调整人格配置以适应场景
|
||||
4. **扩展MCP服务器**:开发更多MCP服务器
|
||||
5. **性能调优**:根据实际使用情况调整参数
|
||||
|
||||
## 技术栈
|
||||
|
||||
- **Python 3.8+**
|
||||
- **OpenAI SDK** - OpenAI API客户端
|
||||
- **Anthropic SDK** - Claude API客户端
|
||||
- **NumPy** - 向量计算
|
||||
- **asyncio** - 异步编程
|
||||
|
||||
## 许可证
|
||||
|
||||
MIT License
|
||||
|
||||
---
|
||||
|
||||
**实现完成时间**:2024-03-02
|
||||
**版本**:v1.0.0
|
||||
138
docs/AI_INTEGRATION_COMPLETE.md
Normal file
138
docs/AI_INTEGRATION_COMPLETE.md
Normal file
@@ -0,0 +1,138 @@
|
||||
# AI接入完成 ✅
|
||||
|
||||
## 🎉 接入状态
|
||||
|
||||
AI功能已成功接入QQ机器人!
|
||||
|
||||
### ✅ 已完成的功能
|
||||
|
||||
1. **AI对话系统** - 使用 SiliconFlow DeepSeek-V3.2 模型
|
||||
2. **记忆系统** - 短期记忆 + 长期记忆 + RAG检索(Chroma向量数据库)
|
||||
3. **人格系统** - 支持多种人格切换
|
||||
4. **Skills插件** - 已加载天气查询技能
|
||||
5. **MCP系统** - 文件系统访问服务器
|
||||
|
||||
### 📊 初始化日志
|
||||
|
||||
```
|
||||
✅ 嵌入模型初始化: openai/BAAI/bge-large-zh-v1.5
|
||||
✅ Chroma向量数据库初始化: data\ai\chroma_db
|
||||
✅ AI客户端初始化完成: openai/Pro/deepseek-ai/DeepSeek-V3.2
|
||||
✅ 加载了 1 个技能
|
||||
✅ MCP系统初始化完成
|
||||
✅ AI系统初始化完成
|
||||
```
|
||||
|
||||
## 🚀 使用方法
|
||||
|
||||
### 基础对话
|
||||
|
||||
在QQ中@机器人发送消息:
|
||||
|
||||
```
|
||||
@机器人 你好
|
||||
@机器人 今天天气怎么样?
|
||||
@机器人 帮我写一段Python代码
|
||||
```
|
||||
|
||||
### 可用命令
|
||||
|
||||
| 命令 | 说明 |
|
||||
|------|------|
|
||||
| `/help` | 显示帮助信息 |
|
||||
| `/clear` | 清除对话记忆 |
|
||||
| `/personality` | 查看当前人格 |
|
||||
| `/personality <名称>` | 切换人格 |
|
||||
| `/skills` | 查看已加载的技能 |
|
||||
| `/task <任务ID>` | 查看任务状态 |
|
||||
|
||||
### 人格列表
|
||||
|
||||
- **default** - 友好的助手
|
||||
- **tech_expert** - 技术专家
|
||||
- **creative** - 创意伙伴
|
||||
|
||||
## 🔧 配置说明
|
||||
|
||||
当前配置(`.env`):
|
||||
|
||||
```env
|
||||
# AI主模型配置
|
||||
AI_PROVIDER=siliconflow
|
||||
AI_MODEL=Pro/deepseek-ai/DeepSeek-V3.2
|
||||
AI_API_KEY=sk-znjpzcbvadzoijtvplcdjhwyrpwtvolfbyvnshjulrqsmbju
|
||||
AI_API_BASE=https://api.siliconflow.cn/v1
|
||||
|
||||
# AI嵌入模型配置(用于RAG)
|
||||
AI_EMBED_PROVIDER=siliconflow
|
||||
AI_EMBED_MODEL=BAAI/bge-large-zh-v1.5
|
||||
AI_EMBED_API_BASE=https://api.siliconflow.cn/v1
|
||||
```
|
||||
|
||||
## 🐛 已修复的问题
|
||||
|
||||
1. ✅ **事件循环问题** - 修改为延迟初始化,在第一次收到消息时才初始化AI
|
||||
2. ✅ **用户ID获取** - 添加了兼容不同消息类型的用户ID获取方法
|
||||
|
||||
## 📝 核心代码修改
|
||||
|
||||
### 1. `src/core/bot.py`
|
||||
|
||||
```python
|
||||
# 修改前
|
||||
from src.handlers.message_handler import MessageHandler
|
||||
|
||||
# 修改后
|
||||
from src.handlers.message_handler_ai import MessageHandler
|
||||
```
|
||||
|
||||
### 2. `src/handlers/message_handler_ai.py`
|
||||
|
||||
关键改进:
|
||||
|
||||
- **延迟初始化**:在第一次收到消息时才初始化AI系统
|
||||
- **用户ID兼容**:支持多种消息类型的用户ID获取
|
||||
- **错误处理**:完善的异常捕获和日志记录
|
||||
|
||||
```python
|
||||
@staticmethod
|
||||
def _get_user_id(message: Message) -> str:
|
||||
"""获取用户ID(兼容不同消息类型)"""
|
||||
author = getattr(message, 'author', None)
|
||||
if not author:
|
||||
return 'unknown'
|
||||
|
||||
# 尝试不同的ID字段
|
||||
return (
|
||||
getattr(author, 'id', None) or
|
||||
getattr(author, 'user_openid', None) or
|
||||
getattr(author, 'member_openid', None) or
|
||||
getattr(author, 'union_openid', None) or
|
||||
'unknown'
|
||||
)
|
||||
```
|
||||
|
||||
## 🎯 下一步建议
|
||||
|
||||
1. **测试对话功能** - 在QQ中@机器人测试各种对话
|
||||
2. **添加更多Skills** - 在 `skills/` 目录下添加自定义技能
|
||||
3. **调整人格** - 在 `data/ai/personalities.json` 中自定义人格
|
||||
4. **监控日志** - 观察 AI 的响应质量和性能
|
||||
|
||||
## 📚 相关文档
|
||||
|
||||
- [配置指南](docs/CONFIG_GUIDE.md)
|
||||
- [AI快速开始](docs/AI_QUICKSTART.md)
|
||||
- [完整文档](src/ai/docs/README.md)
|
||||
|
||||
## 💡 提示
|
||||
|
||||
- 机器人会记住对话历史(短期记忆30分钟)
|
||||
- 重要对话会自动保存到长期记忆
|
||||
- 使用 `/clear` 可以清除记忆重新开始
|
||||
- RAG检索会自动从历史对话中查找相关信息
|
||||
|
||||
---
|
||||
|
||||
**状态**: ✅ AI接入完成,可以正常使用!
|
||||
**时间**: 2026-03-02 22:19
|
||||
262
docs/AI_QUICKSTART.md
Normal file
262
docs/AI_QUICKSTART.md
Normal file
@@ -0,0 +1,262 @@
|
||||
# AI模型接入快速开始
|
||||
|
||||
## 🚀 快速开始
|
||||
|
||||
### 1. 安装依赖
|
||||
|
||||
```bash
|
||||
pip install -r requirements-ai.txt
|
||||
```
|
||||
|
||||
### 2. 配置环境变量
|
||||
|
||||
复制 `.env.ai.example` 到 `.env` 并填入你的配置:
|
||||
|
||||
```bash
|
||||
cp .env.ai.example .env
|
||||
```
|
||||
|
||||
编辑 `.env` 文件:
|
||||
|
||||
```env
|
||||
# 机器人配置
|
||||
BOT_APPID=你的机器人APPID
|
||||
BOT_SECRET=你的机器人SECRET
|
||||
|
||||
# AI配置
|
||||
AI_PROVIDER=openai # 可选: openai, anthropic, deepseek, qwen
|
||||
AI_MODEL=gpt-4
|
||||
AI_API_KEY=你的API密钥
|
||||
AI_API_BASE=https://api.openai.com/v1 # 可选
|
||||
```
|
||||
|
||||
### 3. 启动机器人
|
||||
|
||||
```bash
|
||||
python main.py
|
||||
```
|
||||
|
||||
或使用启动脚本:
|
||||
|
||||
```bash
|
||||
# Windows
|
||||
start.bat
|
||||
|
||||
# Linux/Mac
|
||||
./start.sh
|
||||
```
|
||||
|
||||
## 📚 功能说明
|
||||
|
||||
### ✅ 已实现功能
|
||||
|
||||
1. **多模型支持**
|
||||
- OpenAI (GPT-4, GPT-3.5等)
|
||||
- Anthropic Claude
|
||||
- DeepSeek
|
||||
- Qwen (通义千问)
|
||||
|
||||
2. **人格系统**
|
||||
- 预设3种人格:默认助手、技术专家、创意伙伴
|
||||
- 支持自定义人格
|
||||
- 可动态切换
|
||||
|
||||
3. **记忆系统**
|
||||
- 短期记忆:最近20条对话,30分钟过期
|
||||
- 长期记忆:重要对话持久化存储
|
||||
- RAG检索:基于向量相似度的智能检索
|
||||
|
||||
4. **长任务处理**
|
||||
- 多步骤任务分解
|
||||
- 进度跟踪
|
||||
- 任务暂停/恢复/取消
|
||||
|
||||
5. **Skills插件系统**
|
||||
- 可扩展的技能插件
|
||||
- 示例:天气查询技能
|
||||
- 支持热加载/卸载
|
||||
|
||||
6. **MCP支持**
|
||||
- Model Context Protocol标准
|
||||
- 文件系统访问服务器
|
||||
- 可自定义MCP服务器
|
||||
|
||||
## 🎮 使用命令
|
||||
|
||||
在QQ中@机器人使用以下命令:
|
||||
|
||||
### 基础命令
|
||||
|
||||
- `/help` - 显示帮助信息
|
||||
- `/clear` - 清除对话记忆
|
||||
- `/personality` - 查看当前人格
|
||||
- `/personality list` - 查看全部人格
|
||||
- `/personality set <key>` - 切换人格
|
||||
- `/personality add <key> <json或管道格式>` - 新增人格(角色扮演)
|
||||
- `/personality remove <key>` - 删除人格
|
||||
|
||||
### 技能命令
|
||||
|
||||
- `/skills` - 查看已加载的技能
|
||||
- `/skills install <source> [skill_name]` - 从本地/网络安装并加载技能
|
||||
- `/skills uninstall <skill_name>` - 卸载技能
|
||||
- `/skills reload <skill_name>` - 重载技能
|
||||
- `/task <任务ID>` - 查看任务状态
|
||||
|
||||
`source` 支持:
|
||||
- 本地技能名,如 `weather`
|
||||
- URL(zip 包)
|
||||
- GitHub 简写,如 `owner/repo` 或 `owner/repo#branch`
|
||||
|
||||
### 对话示例
|
||||
|
||||
```
|
||||
用户: @机器人 你好
|
||||
机器人: 你好!我是小助手,很高兴为你服务。有什么我可以帮助你的吗?
|
||||
|
||||
用户: @机器人 我喜欢编程
|
||||
机器人: 太好了!编程是一项很有趣的技能。你主要使用什么编程语言呢?
|
||||
|
||||
用户: @机器人 /personality set tech_expert
|
||||
机器人: ✅ 已切换到人格: tech_expert
|
||||
|
||||
用户: @机器人 如何优化Python性能?
|
||||
机器人: 从技术角度来看,Python性能优化可以从以下几个方面入手:
|
||||
1. 使用内置函数和标准库
|
||||
2. 避免全局变量
|
||||
3. 使用列表推导式
|
||||
...
|
||||
```
|
||||
|
||||
## 🔧 高级配置
|
||||
|
||||
### 自定义人格
|
||||
|
||||
编辑 `config/personalities.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"my_personality": {
|
||||
"name": "我的人格",
|
||||
"description": "描述",
|
||||
"traits": ["FRIENDLY", "CREATIVE"],
|
||||
"speaking_style": "说话风格",
|
||||
"example_responses": ["示例1", "示例2"],
|
||||
"custom_instructions": "特殊指令"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 创建自定义技能
|
||||
|
||||
```bash
|
||||
# 使用Python创建技能模板
|
||||
python -c "from src.ai.skills.base import create_skill_template; from pathlib import Path; create_skill_template('my_skill', Path('skills'))"
|
||||
```
|
||||
|
||||
然后编辑 `skills/my_skill/main.py` 实现你的技能。
|
||||
|
||||
### 配置MCP服务器
|
||||
|
||||
编辑 `config/mcp.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"filesystem": {
|
||||
"enabled": true,
|
||||
"root_path": "data"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 📖 详细文档
|
||||
|
||||
查看完整文档:[src/ai/README.md](src/ai/README.md)
|
||||
|
||||
## 🐛 故障排查
|
||||
|
||||
### 问题1: AI功能不可用
|
||||
|
||||
**解决方案:**
|
||||
1. 检查 `.env` 文件中的 `AI_API_KEY` 是否正确
|
||||
2. 检查网络连接
|
||||
3. 查看日志文件 `botpy.log`
|
||||
|
||||
### 问题2: 技能加载失败
|
||||
|
||||
**解决方案:**
|
||||
1. 检查 `skills/技能名/skill.json` 格式是否正确
|
||||
2. 确保 `main.py` 中有继承自 `Skill` 的类
|
||||
3. 查看日志中的错误信息
|
||||
|
||||
### 问题3: 记忆系统不工作
|
||||
|
||||
**解决方案:**
|
||||
1. 确保 `data/ai` 目录有写入权限
|
||||
2. 检查是否在对话时设置了 `use_memory=True`
|
||||
3. 查看 `data/ai/long_term_memory.json` 是否正常
|
||||
|
||||
## 🎯 最佳实践
|
||||
|
||||
1. **合理使用记忆**
|
||||
- 重要对话会自动保存到长期记忆
|
||||
- 定期使用 `/clear` 清理短期记忆
|
||||
- 为重要信息添加关键词(如"重要"、"记住")
|
||||
|
||||
2. **人格切换**
|
||||
- 根据场景选择合适的人格
|
||||
- 技术问题用 `tech_expert`
|
||||
- 创意讨论用 `creative`
|
||||
- 日常对话用 `default`
|
||||
|
||||
3. **技能开发**
|
||||
- 保持技能功能单一
|
||||
- 提供清晰的工具描述
|
||||
- 处理异常情况
|
||||
|
||||
## 📊 性能优化
|
||||
|
||||
### 记忆系统优化
|
||||
|
||||
```python
|
||||
# 调整短期记忆大小
|
||||
client.memory.short_term.max_size = 30 # 默认20
|
||||
|
||||
# 调整重要性阈值
|
||||
client.memory.importance_threshold = 0.7 # 默认0.6
|
||||
```
|
||||
|
||||
### 模型参数调整
|
||||
|
||||
```python
|
||||
config = ModelConfig(
|
||||
provider=ModelProvider.OPENAI,
|
||||
model_name="gpt-4",
|
||||
temperature=0.7, # 创造性 0-2
|
||||
max_tokens=4096, # 最大输出长度
|
||||
top_p=1.0, # 采样参数
|
||||
)
|
||||
```
|
||||
|
||||
## 🔄 更新日志
|
||||
|
||||
### v1.0.0 (2024-03-02)
|
||||
- ✅ 初始版本
|
||||
- ✅ 支持多种AI模型
|
||||
- ✅ 人格系统
|
||||
- ✅ 记忆系统(短期+长期+RAG)
|
||||
- ✅ 长任务处理
|
||||
- ✅ Skills插件系统
|
||||
- ✅ MCP支持
|
||||
|
||||
## 📝 示例代码
|
||||
|
||||
查看 `examples/ai_example.py` 获取完整示例。
|
||||
|
||||
## 🤝 贡献
|
||||
|
||||
欢迎提交Issue和Pull Request!
|
||||
|
||||
## 📄 许可证
|
||||
|
||||
MIT License
|
||||
495
docs/AI_SUMMARY.md
Normal file
495
docs/AI_SUMMARY.md
Normal file
@@ -0,0 +1,495 @@
|
||||
# AI模型接入系统 - 完整实现总结
|
||||
|
||||
## 🎉 实现完成
|
||||
|
||||
已成功实现完整的AI模型接入系统,包含所有要求的功能:
|
||||
|
||||
### ✅ 核心功能
|
||||
|
||||
1. **AI模型接入** - 支持多种主流AI模型
|
||||
2. **Skills系统** - 可扩展的技能插件
|
||||
3. **MCP支持** - Model Context Protocol标准
|
||||
4. **人格系统** - 可自定义AI性格
|
||||
5. **记忆系统** - 短期+长期+RAG检索
|
||||
6. **长任务能力** - 多步骤任务处理
|
||||
|
||||
---
|
||||
|
||||
## 📁 文件清单
|
||||
|
||||
### 核心模块
|
||||
|
||||
```
|
||||
src/ai/
|
||||
├── __init__.py # 模块导出
|
||||
├── base.py # 基础类和接口 (117行)
|
||||
├── client.py # AI客户端统一接口 (241行)
|
||||
├── personality.py # 人格系统 (177行)
|
||||
├── memory.py # 记忆系统 (307行)
|
||||
├── task_manager.py # 长任务管理 (328行)
|
||||
├── models/
|
||||
│ ├── __init__.py
|
||||
│ ├── openai_model.py # OpenAI模型 (95行)
|
||||
│ └── anthropic_model.py # Anthropic模型 (121行)
|
||||
├── skills/
|
||||
│ ├── __init__.py
|
||||
│ └── base.py # Skills框架 (234行)
|
||||
└── mcp/
|
||||
├── __init__.py
|
||||
├── base.py # MCP框架 (220行)
|
||||
└── servers/
|
||||
├── __init__.py
|
||||
└── filesystem.py # 文件系统服务器 (124行)
|
||||
```
|
||||
|
||||
### 配置和示例
|
||||
|
||||
```
|
||||
config/
|
||||
├── personalities.json # 人格配置
|
||||
└── mcp.json # MCP配置
|
||||
|
||||
skills/
|
||||
└── weather/ # 示例技能
|
||||
├── skill.json
|
||||
├── main.py
|
||||
└── README.md
|
||||
|
||||
examples/
|
||||
└── ai_example.py # 完整使用示例
|
||||
|
||||
tests/
|
||||
└── test_ai.py # 功能测试
|
||||
|
||||
src/handlers/
|
||||
└── message_handler_ai.py # QQ机器人集成
|
||||
```
|
||||
|
||||
### 文档
|
||||
|
||||
```
|
||||
AI_QUICKSTART.md # 快速开始指南
|
||||
AI_IMPLEMENTATION.md # 实现总结
|
||||
src/ai/README.md # 完整文档 (546行)
|
||||
requirements-ai.txt # 依赖包
|
||||
.env.ai.example # 配置示例
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 快速开始
|
||||
|
||||
### 1. 安装依赖
|
||||
|
||||
```bash
|
||||
pip install -r requirements-ai.txt
|
||||
```
|
||||
|
||||
### 2. 配置环境变量
|
||||
|
||||
```bash
|
||||
# 复制配置示例
|
||||
cp .env.ai.example .env
|
||||
|
||||
# 编辑 .env 文件,填入你的配置
|
||||
AI_PROVIDER=openai
|
||||
AI_MODEL=gpt-4
|
||||
AI_API_KEY=your_api_key_here
|
||||
```
|
||||
|
||||
### 3. 运行测试
|
||||
|
||||
```bash
|
||||
# 测试AI功能(不需要API密钥的部分)
|
||||
python tests/test_ai.py
|
||||
|
||||
# 运行完整示例(需要API密钥)
|
||||
python examples/ai_example.py
|
||||
```
|
||||
|
||||
### 4. 集成到QQ机器人
|
||||
|
||||
修改 `src/core/bot.py`:
|
||||
|
||||
```python
|
||||
# 将这行
|
||||
from src.handlers.message_handler import MessageHandler
|
||||
|
||||
# 改为
|
||||
from src.handlers.message_handler_ai import MessageHandler
|
||||
```
|
||||
|
||||
然后启动机器人:
|
||||
|
||||
```bash
|
||||
python main.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 💡 核心特性详解
|
||||
|
||||
### 1. AI模型接入
|
||||
|
||||
**支持的模型**:
|
||||
- OpenAI (GPT-4, GPT-3.5-turbo等)
|
||||
- Anthropic Claude (Claude-3.5-Sonnet等)
|
||||
- DeepSeek (deepseek-chat)
|
||||
- Qwen (通义千问)
|
||||
|
||||
**特性**:
|
||||
- 统一接口,轻松切换模型
|
||||
- 支持流式响应
|
||||
- 支持Function Calling
|
||||
- 自动错误处理和重试
|
||||
|
||||
**使用示例**:
|
||||
```python
|
||||
from src.ai import AIClient
|
||||
from src.ai.base import ModelConfig, ModelProvider
|
||||
|
||||
config = ModelConfig(
|
||||
provider=ModelProvider.OPENAI,
|
||||
model_name="gpt-4",
|
||||
api_key="your_key"
|
||||
)
|
||||
|
||||
client = AIClient(config)
|
||||
response = await client.chat(
|
||||
user_id="user123",
|
||||
user_message="你好"
|
||||
)
|
||||
```
|
||||
|
||||
### 2. 人格系统
|
||||
|
||||
**预设人格**:
|
||||
- `default` - 友好的助手
|
||||
- `tech_expert` - 技术专家
|
||||
- `creative` - 创意伙伴
|
||||
|
||||
**自定义人格**:
|
||||
```python
|
||||
from src.ai.personality import PersonalityProfile, PersonalityTrait
|
||||
|
||||
profile = PersonalityProfile(
|
||||
name="游戏助手",
|
||||
description="专业的游戏顾问",
|
||||
traits=[PersonalityTrait.FRIENDLY, PersonalityTrait.HUMOROUS],
|
||||
speaking_style="活泼、热情",
|
||||
example_responses=["哇!这个操作太秀了!"]
|
||||
)
|
||||
|
||||
client.personality.add_personality('gamer', profile)
|
||||
client.set_personality('gamer')
|
||||
```
|
||||
|
||||
### 3. 记忆系统
|
||||
|
||||
**短期记忆**:
|
||||
- 滑动窗口(默认20条)
|
||||
- 自动过期(默认30分钟)
|
||||
- 按用户隔离
|
||||
|
||||
**长期记忆**:
|
||||
- 自动评估重要性
|
||||
- 持久化存储
|
||||
- 支持向量检索(RAG)
|
||||
|
||||
**重要性评估规则**:
|
||||
- 内容长度 >100字符:+0.1分
|
||||
- 包含关键词("重要"、"记住"等):+0.2分
|
||||
- 是问题:+0.1分
|
||||
- 包含代码:+0.15分
|
||||
- 阈值:≥0.6分保存到长期记忆
|
||||
|
||||
**使用示例**:
|
||||
```python
|
||||
# 自动记忆
|
||||
response = await client.chat(
|
||||
user_id="user123",
|
||||
user_message="我喜欢编程",
|
||||
use_memory=True # 自动保存和检索记忆
|
||||
)
|
||||
|
||||
# 手动查询记忆
|
||||
short_term, long_term = await client.memory.get_context(
|
||||
user_id="user123",
|
||||
query="我们之前讨论过什么?"
|
||||
)
|
||||
```
|
||||
|
||||
### 4. 长任务处理
|
||||
|
||||
**功能**:
|
||||
- 任务分解为多个步骤
|
||||
- 实时进度跟踪
|
||||
- 支持暂停/恢复/取消
|
||||
- 持久化存储
|
||||
|
||||
**使用示例**:
|
||||
```python
|
||||
# 注册动作处理器
|
||||
async def load_data(file_path: str):
|
||||
# 实现数据加载
|
||||
return {"rows": 1000}
|
||||
|
||||
client.task_manager.register_action("load_data", load_data)
|
||||
|
||||
# 创建任务
|
||||
task_id = await client.create_long_task(
|
||||
user_id="user123",
|
||||
title="数据分析",
|
||||
description="分析用户数据",
|
||||
steps=[
|
||||
{
|
||||
"description": "加载数据",
|
||||
"action": "load_data",
|
||||
"params": {"file_path": "data.csv"}
|
||||
},
|
||||
# 更多步骤...
|
||||
]
|
||||
)
|
||||
|
||||
# 启动任务
|
||||
async def on_progress(task_id, progress, message):
|
||||
print(f"{progress*100:.0f}% - {message}")
|
||||
|
||||
await client.start_task(task_id, progress_callback=on_progress)
|
||||
```
|
||||
|
||||
### 5. Skills插件系统
|
||||
|
||||
**创建技能**:
|
||||
```python
|
||||
from src.ai.skills.base import Skill
|
||||
|
||||
class MySkill(Skill):
|
||||
async def initialize(self):
|
||||
self.register_tool("my_tool", self.my_tool)
|
||||
|
||||
async def my_tool(self, param: str) -> str:
|
||||
return f"处理: {param}"
|
||||
```
|
||||
|
||||
**加载技能**:
|
||||
```python
|
||||
from src.ai.skills import SkillsManager
|
||||
|
||||
manager = SkillsManager(Path("skills"))
|
||||
await manager.load_skill("weather")
|
||||
|
||||
# 获取所有工具
|
||||
tools = manager.get_all_tools()
|
||||
```
|
||||
|
||||
### 6. MCP支持
|
||||
|
||||
**内置服务器**:
|
||||
- 文件系统访问服务器
|
||||
|
||||
**自定义服务器**:
|
||||
```python
|
||||
from src.ai.mcp.base import MCPServer
|
||||
|
||||
class MyMCPServer(MCPServer):
|
||||
def __init__(self):
|
||||
super().__init__(name="my_server", version="1.0.0")
|
||||
|
||||
async def initialize(self):
|
||||
self.register_tool(
|
||||
name="my_tool",
|
||||
description="我的工具",
|
||||
input_schema={...},
|
||||
handler=self.my_handler
|
||||
)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎮 QQ机器人命令
|
||||
|
||||
在QQ中@机器人使用:
|
||||
|
||||
### 基础命令
|
||||
- `/help` - 显示帮助
|
||||
- `/clear` - 清除记忆
|
||||
- `/personality` - 查看当前人格
|
||||
- `/personality <名称>` - 切换人格
|
||||
|
||||
### 技能命令
|
||||
- `/skills` - 查看已加载技能
|
||||
- `/task <ID>` - 查看任务状态
|
||||
|
||||
### 对话示例
|
||||
```
|
||||
用户: @机器人 你好
|
||||
机器人: 你好!我是小助手,很高兴为你服务。
|
||||
|
||||
用户: @机器人 我喜欢编程
|
||||
机器人: 太好了!编程是一项很有趣的技能...
|
||||
|
||||
用户: @机器人 /personality tech_expert
|
||||
机器人: ✅ 已切换到人格: tech_expert
|
||||
|
||||
用户: @机器人 如何优化Python性能?
|
||||
机器人: 从技术角度来看,Python性能优化可以从以下几个方面入手...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 代码统计
|
||||
|
||||
### 核心代码
|
||||
- **总行数**:约2,500行
|
||||
- **模块数**:15个
|
||||
- **类数**:30+个
|
||||
- **函数数**:100+个
|
||||
|
||||
### 文档
|
||||
- **文档行数**:约1,500行
|
||||
- **示例代码**:3个完整示例
|
||||
- **测试用例**:6个测试函数
|
||||
|
||||
---
|
||||
|
||||
## 🔧 技术架构
|
||||
|
||||
### 设计模式
|
||||
- **工厂模式**:模型创建
|
||||
- **策略模式**:不同AI提供商
|
||||
- **观察者模式**:任务进度回调
|
||||
- **插件模式**:Skills系统
|
||||
- **适配器模式**:MCP服务器
|
||||
|
||||
### 核心技术
|
||||
- **异步编程**:全异步实现
|
||||
- **类型提示**:完整类型注解
|
||||
- **依赖注入**:松耦合设计
|
||||
- **配置管理**:JSON配置文件
|
||||
- **持久化**:JSON文件存储
|
||||
|
||||
---
|
||||
|
||||
## 🎯 使用场景
|
||||
|
||||
### 1. 智能客服
|
||||
- 使用记忆系统记住用户信息
|
||||
- 使用人格系统提供友好服务
|
||||
- 使用Skills扩展业务功能
|
||||
|
||||
### 2. 技术助手
|
||||
- 切换到tech_expert人格
|
||||
- 使用长任务处理复杂问题
|
||||
- 使用MCP访问代码库
|
||||
|
||||
### 3. 创意伙伴
|
||||
- 切换到creative人格
|
||||
- 使用记忆系统保持创意连贯性
|
||||
- 使用Skills生成内容
|
||||
|
||||
---
|
||||
|
||||
## 📈 性能优化建议
|
||||
|
||||
### 1. 记忆系统
|
||||
```python
|
||||
# 调整短期记忆大小
|
||||
client.memory.short_term.max_size = 30
|
||||
|
||||
# 调整重要性阈值
|
||||
client.memory.importance_threshold = 0.7
|
||||
```
|
||||
|
||||
### 2. 模型参数
|
||||
```python
|
||||
config = ModelConfig(
|
||||
temperature=0.7, # 创造性
|
||||
max_tokens=4096, # 输出长度
|
||||
top_p=1.0, # 采样
|
||||
)
|
||||
```
|
||||
|
||||
### 3. 并发处理
|
||||
```python
|
||||
# 并发执行多个任务
|
||||
tasks = [client.start_task(tid) for tid in task_ids]
|
||||
await asyncio.gather(*tasks)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🐛 故障排查
|
||||
|
||||
### 常见问题
|
||||
|
||||
**1. API调用失败**
|
||||
- 检查API密钥
|
||||
- 检查网络连接
|
||||
- 查看日志文件
|
||||
|
||||
**2. 记忆不工作**
|
||||
- 确保 `use_memory=True`
|
||||
- 检查数据目录权限
|
||||
- 查看 `data/ai/long_term_memory.json`
|
||||
|
||||
**3. 技能加载失败**
|
||||
- 检查 `skill.json` 格式
|
||||
- 确保有Skill子类
|
||||
- 查看错误日志
|
||||
|
||||
---
|
||||
|
||||
## 📚 学习资源
|
||||
|
||||
### 文档
|
||||
- `AI_QUICKSTART.md` - 快速开始
|
||||
- `src/ai/README.md` - 完整文档
|
||||
- `AI_IMPLEMENTATION.md` - 实现总结
|
||||
|
||||
### 示例
|
||||
- `examples/ai_example.py` - 完整示例
|
||||
- `tests/test_ai.py` - 测试用例
|
||||
- `skills/weather/` - 技能示例
|
||||
|
||||
---
|
||||
|
||||
## 🔄 后续扩展
|
||||
|
||||
### 建议功能
|
||||
1. **更多模型支持**:本地模型、其他云服务
|
||||
2. **高级记忆**:图数据库、向量数据库
|
||||
3. **多模态**:图像、语音支持
|
||||
4. **分布式**:多实例协作
|
||||
5. **监控面板**:Web管理界面
|
||||
|
||||
### 技能开发
|
||||
1. **搜索技能**:网络搜索、知识库搜索
|
||||
2. **工具技能**:计算器、翻译、代码执行
|
||||
3. **娱乐技能**:游戏、音乐、图片生成
|
||||
4. **业务技能**:订单查询、数据分析
|
||||
|
||||
---
|
||||
|
||||
## ✨ 总结
|
||||
|
||||
这是一个**生产级**的AI模型接入系统,具有:
|
||||
|
||||
- ✅ **完整功能**:所有要求的功能都已实现
|
||||
- ✅ **模块化设计**:易于维护和扩展
|
||||
- ✅ **高性能**:全异步,支持并发
|
||||
- ✅ **易用性**:清晰的API,丰富的文档
|
||||
- ✅ **可扩展**:Skills和MCP支持无限扩展
|
||||
- ✅ **生产就绪**:完善的错误处理和日志
|
||||
|
||||
**立即开始使用**:查看 `AI_QUICKSTART.md`
|
||||
|
||||
**深入学习**:阅读 `src/ai/README.md`
|
||||
|
||||
**实践练习**:运行 `examples/ai_example.py`
|
||||
|
||||
---
|
||||
|
||||
**实现时间**:2024-03-02
|
||||
**版本**:v1.0.0
|
||||
**许可证**:MIT License
|
||||
210
docs/CHANGELOG.md
Normal file
210
docs/CHANGELOG.md
Normal file
@@ -0,0 +1,210 @@
|
||||
# 更新说明 - v1.0.1
|
||||
|
||||
## 🔄 本次更新内容
|
||||
|
||||
### 1. ✅ 统一配置管理
|
||||
|
||||
**问题**:之前AI配置分散在多个文件中
|
||||
**解决**:所有配置现在统一在 `.env` 文件中管理
|
||||
|
||||
**更新的文件**:
|
||||
- `.env.example` - 添加了完整的AI配置项
|
||||
- `src/core/config.py` - 添加了AI嵌入模型配置
|
||||
- 删除了 `.env.ai.example`(已合并到 `.env.example`)
|
||||
|
||||
### 2. ✅ 文档结构优化
|
||||
|
||||
**问题**:文档散落在项目根目录
|
||||
**解决**:所有文档移动到对应的 `docs` 目录
|
||||
|
||||
**新的文档结构**:
|
||||
```
|
||||
docs/
|
||||
├── README.md # 文档索引(新增)
|
||||
├── CONFIG_GUIDE.md # 配置指南(新增)
|
||||
├── AI_QUICKSTART.md # 快速开始
|
||||
├── AI_IMPLEMENTATION.md # 实现总结
|
||||
└── AI_SUMMARY.md # 功能总结
|
||||
|
||||
src/ai/docs/
|
||||
└── README.md # 完整文档
|
||||
|
||||
skills/docs/
|
||||
└── (技能相关文档)
|
||||
```
|
||||
|
||||
### 3. ✅ RAG嵌入模型配置
|
||||
|
||||
**问题**:RAG功能需要嵌入模型,但没有配置选项
|
||||
**解决**:添加了独立的嵌入模型配置
|
||||
|
||||
**新增配置项**:
|
||||
```env
|
||||
# AI嵌入模型配置(用于RAG记忆检索)
|
||||
AI_EMBED_PROVIDER=openai
|
||||
AI_EMBED_MODEL=text-embedding-3-small
|
||||
AI_EMBED_API_KEY= # 留空则使用 AI_API_KEY
|
||||
AI_EMBED_API_BASE= # 留空则使用 AI_API_BASE
|
||||
```
|
||||
|
||||
**更新的文件**:
|
||||
- `src/ai/client.py` - 支持独立的嵌入模型配置
|
||||
- `src/handlers/message_handler_ai.py` - 传递嵌入模型配置
|
||||
|
||||
**工作原理**:
|
||||
1. 如果配置了嵌入模型,优先使用独立的嵌入模型
|
||||
2. 如果没有配置,尝试使用主模型的嵌入功能
|
||||
3. 如果主模型不支持(如Claude),RAG功能降级为基于重要性的检索
|
||||
|
||||
## 📝 配置示例
|
||||
|
||||
### 完整配置(推荐)
|
||||
|
||||
```env
|
||||
# QQ机器人配置
|
||||
BOT_APPID=你的机器人APPID
|
||||
BOT_SECRET=你的机器人SECRET
|
||||
|
||||
# AI主模型
|
||||
AI_PROVIDER=openai
|
||||
AI_MODEL=gpt-4
|
||||
AI_API_KEY=sk-xxx
|
||||
|
||||
# AI嵌入模型(用于RAG)
|
||||
AI_EMBED_PROVIDER=openai
|
||||
AI_EMBED_MODEL=text-embedding-3-small
|
||||
AI_EMBED_API_KEY= # 留空使用主模型的key
|
||||
```
|
||||
|
||||
### 使用Claude + OpenAI嵌入
|
||||
|
||||
```env
|
||||
# 主模型(Claude)
|
||||
AI_PROVIDER=anthropic
|
||||
AI_MODEL=claude-3-5-sonnet-20241022
|
||||
AI_API_KEY=sk-ant-xxx
|
||||
|
||||
# 嵌入模型(OpenAI)
|
||||
AI_EMBED_PROVIDER=openai
|
||||
AI_EMBED_MODEL=text-embedding-3-small
|
||||
AI_EMBED_API_KEY=sk-xxx # 需要单独的OpenAI key
|
||||
```
|
||||
|
||||
### 最简配置(不使用RAG)
|
||||
|
||||
```env
|
||||
# 只配置主模型
|
||||
AI_PROVIDER=openai
|
||||
AI_MODEL=gpt-4
|
||||
AI_API_KEY=sk-xxx
|
||||
|
||||
# 不配置嵌入模型,RAG功能会降级
|
||||
```
|
||||
|
||||
## 🚀 如何更新
|
||||
|
||||
### 1. 更新配置文件
|
||||
|
||||
```bash
|
||||
# 备份现有配置
|
||||
cp .env .env.backup
|
||||
|
||||
# 查看新的配置模板
|
||||
cat .env.example
|
||||
|
||||
# 手动添加嵌入模型配置到 .env
|
||||
```
|
||||
|
||||
在 `.env` 文件中添加:
|
||||
```env
|
||||
# AI嵌入模型配置(用于RAG记忆检索)
|
||||
AI_EMBED_PROVIDER=openai
|
||||
AI_EMBED_MODEL=text-embedding-3-small
|
||||
AI_EMBED_API_KEY=
|
||||
AI_EMBED_API_BASE=
|
||||
```
|
||||
|
||||
### 2. 查看新文档
|
||||
|
||||
```bash
|
||||
# 查看文档索引
|
||||
cat docs/README.md
|
||||
|
||||
# 查看配置指南
|
||||
cat docs/CONFIG_GUIDE.md
|
||||
```
|
||||
|
||||
### 3. 重启机器人
|
||||
|
||||
```bash
|
||||
python main.py
|
||||
```
|
||||
|
||||
查看日志确认配置成功:
|
||||
```
|
||||
✅ AI配置: openai/gpt-4
|
||||
✅ 嵌入模型初始化: openai/text-embedding-3-small
|
||||
✅ AI客户端初始化完成: openai/gpt-4
|
||||
```
|
||||
|
||||
## 📚 文档导航
|
||||
|
||||
- **配置说明**:`docs/CONFIG_GUIDE.md` ⭐ 重要!
|
||||
- **快速开始**:`docs/AI_QUICKSTART.md`
|
||||
- **完整文档**:`src/ai/docs/README.md`
|
||||
- **文档索引**:`docs/README.md`
|
||||
|
||||
## ⚠️ 注意事项
|
||||
|
||||
1. **嵌入模型是可选的**
|
||||
- 如果不配置,系统会尝试使用主模型的嵌入功能
|
||||
- 如果主模型不支持,RAG功能会降级但不影响基本使用
|
||||
|
||||
2. **Claude用户需要额外配置**
|
||||
- Claude不提供嵌入API
|
||||
- 建议配置OpenAI的嵌入模型作为补充
|
||||
|
||||
3. **配置文件位置**
|
||||
- 所有配置都在 `.env` 文件中
|
||||
- 不再需要 `.env.ai.example`
|
||||
|
||||
## 🐛 问题排查
|
||||
|
||||
### 问题1: 找不到嵌入模型配置
|
||||
|
||||
**解决**:检查 `.env` 文件是否包含 `AI_EMBED_*` 配置项
|
||||
|
||||
### 问题2: RAG功能不工作
|
||||
|
||||
**解决**:
|
||||
1. 检查是否配置了嵌入模型
|
||||
2. 查看日志是否有 "嵌入模型初始化" 的提示
|
||||
3. 如果没有配置,RAG会降级为基于重要性的检索
|
||||
|
||||
### 问题3: 文档找不到了
|
||||
|
||||
**解决**:文档已移动到 `docs/` 目录,查看 `docs/README.md` 获取索引
|
||||
|
||||
## 📊 版本对比
|
||||
|
||||
| 功能 | v1.0.0 | v1.0.1 |
|
||||
|------|--------|--------|
|
||||
| 配置文件 | 分散 | 统一在.env |
|
||||
| 文档位置 | 根目录 | docs目录 |
|
||||
| RAG嵌入模型 | 未配置 | 可配置 |
|
||||
| 配置指南 | 无 | 新增 |
|
||||
|
||||
## 🎉 总结
|
||||
|
||||
本次更新主要解决了三个问题:
|
||||
1. ✅ 配置统一管理
|
||||
2. ✅ 文档结构优化
|
||||
3. ✅ RAG嵌入模型支持
|
||||
|
||||
所有功能保持向后兼容,现有配置无需修改即可继续使用!
|
||||
|
||||
---
|
||||
|
||||
**更新时间**:2024-03-02
|
||||
**版本**:v1.0.1
|
||||
**上一版本**:v1.0.0
|
||||
226
docs/CONFIG_GUIDE.md
Normal file
226
docs/CONFIG_GUIDE.md
Normal file
@@ -0,0 +1,226 @@
|
||||
# AI模型接入系统 - 配置说明
|
||||
|
||||
## 📋 配置文件说明
|
||||
|
||||
所有配置都在 `.env` 文件中统一管理。
|
||||
|
||||
### 1. 基础配置
|
||||
|
||||
```env
|
||||
# QQ机器人配置
|
||||
BOT_APPID=你的机器人APPID
|
||||
BOT_SECRET=你的机器人SECRET
|
||||
|
||||
# 日志配置
|
||||
LOG_LEVEL=INFO
|
||||
|
||||
# 沙箱模式
|
||||
SANDBOX_MODE=False
|
||||
```
|
||||
|
||||
### 2. AI主模型配置
|
||||
|
||||
```env
|
||||
# AI主模型配置
|
||||
AI_PROVIDER=openai # 可选: openai, anthropic, deepseek, qwen
|
||||
AI_MODEL=gpt-4
|
||||
AI_API_KEY=你的API密钥
|
||||
AI_API_BASE=https://api.openai.com/v1 # 可选
|
||||
```
|
||||
|
||||
**支持的模型提供商**:
|
||||
- `openai` - OpenAI (GPT-4, GPT-3.5-turbo等)
|
||||
- `anthropic` - Anthropic Claude
|
||||
- `deepseek` - DeepSeek
|
||||
- `qwen` - 通义千问
|
||||
|
||||
### 3. AI嵌入模型配置(用于RAG)
|
||||
|
||||
```env
|
||||
# AI嵌入模型配置(用于RAG记忆检索)
|
||||
AI_EMBED_PROVIDER=openai # 可选: openai, deepseek, qwen
|
||||
AI_EMBED_MODEL=text-embedding-3-small
|
||||
AI_EMBED_API_KEY= # 留空则使用 AI_API_KEY
|
||||
AI_EMBED_API_BASE= # 留空则使用 AI_API_BASE
|
||||
|
||||
# 向量数据库配置
|
||||
AI_USE_VECTOR_DB=true # 是否使用Chroma向量数据库(推荐),false则使用JSON存储
|
||||
```
|
||||
|
||||
**为什么需要嵌入模型?**
|
||||
|
||||
嵌入模型用于将文本转换为向量,实现RAG(检索增强生成)功能:
|
||||
- 长期记忆的向量检索
|
||||
- 相似对话的智能查找
|
||||
- 上下文相关性匹配
|
||||
|
||||
|
||||
**向量数据库配置**:
|
||||
|
||||
系统支持两种存储方式:
|
||||
1. **Chroma向量数据库**(推荐):专业的向量存储,支持高效检索和持久化
|
||||
2. **JSON文件存储**:简单的文件存储,适合测试和小规模使用
|
||||
|
||||
```env
|
||||
AI_USE_VECTOR_DB=true # 使用Chroma(推荐)
|
||||
# AI_USE_VECTOR_DB=false # 使用JSON存储
|
||||
```
|
||||
|
||||
**数据迁移**:
|
||||
|
||||
如果你之前使用JSON存储,现在想切换到Chroma,可以使用迁移工具:
|
||||
|
||||
```bash
|
||||
# 预览迁移(不实际执行)
|
||||
python -m src.ai.migrate_data --dry-run
|
||||
|
||||
# 执行迁移
|
||||
python -m src.ai.migrate_data
|
||||
```
|
||||
|
||||
**嵌入模型配置说明**:
|
||||
|
||||
|
||||
1. **使用OpenAI嵌入模型**(推荐):
|
||||
```env
|
||||
AI_EMBED_PROVIDER=openai
|
||||
AI_EMBED_MODEL=text-embedding-3-small # 或 text-embedding-3-large
|
||||
AI_EMBED_API_KEY= # 留空使用主模型的key
|
||||
```
|
||||
|
||||
2. **使用DeepSeek嵌入模型**:
|
||||
```env
|
||||
AI_EMBED_PROVIDER=deepseek
|
||||
AI_EMBED_MODEL=deepseek-chat # DeepSeek使用同一个模型
|
||||
AI_EMBED_API_KEY= # 留空使用主模型的key
|
||||
```
|
||||
|
||||
3. **不配置嵌入模型**:
|
||||
- 如果不配置,系统会尝试使用主模型的嵌入功能
|
||||
- 如果主模型不支持(如Claude),RAG功能将降级为基于重要性的检索
|
||||
|
||||
## 🔧 配置示例
|
||||
|
||||
### 示例1: 使用OpenAI(推荐)
|
||||
|
||||
```env
|
||||
# 主模型
|
||||
AI_PROVIDER=openai
|
||||
AI_MODEL=gpt-4
|
||||
AI_API_KEY=sk-xxx
|
||||
|
||||
# 嵌入模型(使用OpenAI的嵌入模型)
|
||||
AI_EMBED_PROVIDER=openai
|
||||
AI_EMBED_MODEL=text-embedding-3-small
|
||||
AI_EMBED_API_KEY= # 留空,使用主模型的key
|
||||
```
|
||||
|
||||
### 示例2: 使用Claude + OpenAI嵌入
|
||||
|
||||
```env
|
||||
# 主模型(Claude)
|
||||
AI_PROVIDER=anthropic
|
||||
AI_MODEL=claude-3-5-sonnet-20241022
|
||||
AI_API_KEY=sk-ant-xxx
|
||||
|
||||
# 嵌入模型(OpenAI,因为Claude不提供嵌入)
|
||||
AI_EMBED_PROVIDER=openai
|
||||
AI_EMBED_MODEL=text-embedding-3-small
|
||||
AI_EMBED_API_KEY=sk-xxx # 需要单独的OpenAI key
|
||||
```
|
||||
|
||||
### 示例3: 使用DeepSeek
|
||||
|
||||
```env
|
||||
# 主模型
|
||||
AI_PROVIDER=deepseek
|
||||
AI_MODEL=deepseek-chat
|
||||
AI_API_KEY=sk-xxx
|
||||
AI_API_BASE=https://api.deepseek.com/v1
|
||||
|
||||
# 嵌入模型(使用同一个DeepSeek模型)
|
||||
AI_EMBED_PROVIDER=deepseek
|
||||
AI_EMBED_MODEL=deepseek-chat
|
||||
AI_EMBED_API_KEY= # 留空,使用主模型的key
|
||||
AI_EMBED_API_BASE= # 留空,使用主模型的base
|
||||
```
|
||||
|
||||
### 示例4: 不使用RAG(最简配置)
|
||||
|
||||
```env
|
||||
# 只配置主模型,不配置嵌入模型
|
||||
AI_PROVIDER=openai
|
||||
AI_MODEL=gpt-4
|
||||
AI_API_KEY=sk-xxx
|
||||
|
||||
# 不配置嵌入模型
|
||||
# AI_EMBED_PROVIDER=
|
||||
# AI_EMBED_MODEL=
|
||||
```
|
||||
|
||||
这种情况下,记忆系统会降级为基于重要性的检索,不使用向量相似度。
|
||||
|
||||
## 📊 嵌入模型对比
|
||||
|
||||
| 模型 | 提供商 | 维度 | 性能 | 成本 |
|
||||
|------|--------|------|------|------|
|
||||
| text-embedding-3-small | OpenAI | 1536 | 快 | 低 |
|
||||
| text-embedding-3-large | OpenAI | 3072 | 慢 | 高 |
|
||||
| deepseek-chat | DeepSeek | - | 中 | 低 |
|
||||
|
||||
**推荐**:
|
||||
- 一般使用:`text-embedding-3-small`
|
||||
- 高精度需求:`text-embedding-3-large`
|
||||
- 成本敏感:使用主模型的嵌入功能或不使用RAG
|
||||
|
||||
## ⚙️ 高级配置
|
||||
|
||||
### 自定义API地址
|
||||
|
||||
```env
|
||||
# 使用代理或自建服务
|
||||
AI_API_BASE=https://your-proxy.com/v1
|
||||
AI_EMBED_API_BASE=https://your-proxy.com/v1
|
||||
```
|
||||
|
||||
### 使用不同的API密钥
|
||||
|
||||
```env
|
||||
# 主模型使用一个key
|
||||
AI_API_KEY=sk-main-xxx
|
||||
|
||||
# 嵌入模型使用另一个key
|
||||
AI_EMBED_API_KEY=sk-embed-xxx
|
||||
```
|
||||
|
||||
## 🔍 验证配置
|
||||
|
||||
启动机器人后,查看日志:
|
||||
|
||||
```
|
||||
✅ AI配置: openai/gpt-4
|
||||
✅ 嵌入模型初始化: openai/text-embedding-3-small
|
||||
✅ AI客户端初始化完成: openai/gpt-4
|
||||
```
|
||||
|
||||
如果看到这些日志,说明配置成功!
|
||||
|
||||
## ❓ 常见问题
|
||||
|
||||
**Q: 必须配置嵌入模型吗?**
|
||||
A: 不是必须的。如果不配置,RAG功能会降级,但基本功能仍可用。
|
||||
|
||||
**Q: Claude不支持嵌入怎么办?**
|
||||
A: 配置OpenAI的嵌入模型作为补充,或者不使用RAG功能。
|
||||
|
||||
**Q: 嵌入模型可以和主模型不同吗?**
|
||||
A: 可以!推荐使用OpenAI的嵌入模型,即使主模型是其他提供商。
|
||||
|
||||
**Q: 如何降低成本?**
|
||||
A: 使用 `text-embedding-3-small` 或不配置嵌入模型。
|
||||
|
||||
## 📚 相关文档
|
||||
|
||||
- [快速开始](AI_QUICKSTART.md)
|
||||
- [完整文档](../src/ai/docs/README.md)
|
||||
- [实现总结](AI_IMPLEMENTATION.md)
|
||||
148
docs/FIXES.md
Normal file
148
docs/FIXES.md
Normal file
@@ -0,0 +1,148 @@
|
||||
# 修复说明
|
||||
|
||||
## 已修复的问题
|
||||
|
||||
### 1. 日志文件位置问题 ✅
|
||||
|
||||
**问题**: `botpy.log` 文件保存在项目根目录,而不是 `logs/` 文件夹中
|
||||
|
||||
**解决方案**:
|
||||
- 已删除根目录的 `botpy.log` 文件
|
||||
- 日志配置 (`src/utils/logger.py`) 已正确设置为保存到 `logs/` 文件夹
|
||||
- `.gitignore` 已包含 `logs/` 和 `*.log` 规则
|
||||
|
||||
**结果**: 所有日志文件现在都会保存在 `logs/` 文件夹中
|
||||
|
||||
---
|
||||
|
||||
### 2. Intent 配置错误 (错误码 4014) ✅
|
||||
|
||||
**问题**:
|
||||
```
|
||||
[botpy] 关闭, 返回码: 4014, 返回信息: disallowed intents
|
||||
```
|
||||
|
||||
**原因**:
|
||||
- 使用了错误的 intents 初始化方式
|
||||
- 尝试启用了未授权的权限(如 `direct_message`, `public_messages`)
|
||||
|
||||
**解决方案**:
|
||||
修改 `src/core/bot.py` 中的 intents 配置:
|
||||
|
||||
```python
|
||||
# 旧代码(错误)
|
||||
intents = botpy.Intents(
|
||||
public_guild_messages=True,
|
||||
direct_message=True,
|
||||
)
|
||||
|
||||
# 新代码(正确)
|
||||
intents = botpy.Intents.none()
|
||||
intents.public_guild_messages = True # 频道公域消息(@机器人)
|
||||
```
|
||||
|
||||
**说明**:
|
||||
- `Intents.none()` 创建一个空的 intents 对象
|
||||
- 只启用 `public_guild_messages`(频道公域消息),这是默认权限
|
||||
- 其他权限(如群聊、私聊)需要在 QQ 开放平台申请后才能启用
|
||||
|
||||
---
|
||||
|
||||
### 3. 导入错误修复 ✅
|
||||
|
||||
**问题**:
|
||||
```
|
||||
ImportError: cannot import name 'setup_logger' from 'logger'
|
||||
```
|
||||
|
||||
**原因**:
|
||||
- `from logger import setup_logger` 导入了第三方包而不是本地模块
|
||||
|
||||
**解决方案**:
|
||||
修改 `src/handlers/message_handler.py`:
|
||||
|
||||
```python
|
||||
# 旧代码
|
||||
from logger import setup_logger
|
||||
|
||||
# 新代码
|
||||
from src.utils.logger import setup_logger
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 如何测试
|
||||
|
||||
1. 运行启动脚本:
|
||||
```bash
|
||||
start.bat
|
||||
```
|
||||
|
||||
2. 检查日志:
|
||||
```bash
|
||||
# 查看日志文件夹
|
||||
dir logs
|
||||
|
||||
# 查看最新日志
|
||||
type logs\bot.log
|
||||
```
|
||||
|
||||
3. 预期输出:
|
||||
```
|
||||
✅ 配置验证通过
|
||||
✅ Intents 配置完成
|
||||
🚀 正在启动机器人...
|
||||
[botpy] 登录机器人账号中...
|
||||
[botpy] 程序启动...
|
||||
🤖 机器人已启动: [机器人名称] (ID: [机器人ID])
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 注意事项
|
||||
|
||||
### 关于权限申请
|
||||
|
||||
如果需要支持以下功能,需要在 QQ 开放平台申请相应权限:
|
||||
|
||||
1. **群聊@消息** - 需要申请 `GROUP_AND_C2C_EVENT` 权限
|
||||
2. **私聊消息** - 需要申请 `GROUP_AND_C2C_EVENT` 权限
|
||||
3. **频道私信** - 需要申请 `DIRECT_MESSAGE` 权限
|
||||
|
||||
申请地址: https://bot.q.qq.com/
|
||||
|
||||
### 当前支持的功能
|
||||
|
||||
使用默认权限(`public_guild_messages`),机器人可以:
|
||||
- ✅ 接收频道中 @机器人 的消息
|
||||
- ✅ 在频道中回复消息
|
||||
- ✅ 响应基本命令(/help, /ping, /info)
|
||||
|
||||
---
|
||||
|
||||
## 文件结构
|
||||
|
||||
```
|
||||
QQbot/
|
||||
├── logs/ # 日志文件夹(新)
|
||||
│ └── bot.log # 应用日志
|
||||
├── src/
|
||||
│ ├── core/
|
||||
│ │ ├── bot.py # 已修复 intents 配置
|
||||
│ │ └── config.py
|
||||
│ ├── handlers/
|
||||
│ │ └── message_handler.py # 已修复导入
|
||||
│ └── utils/
|
||||
│ └── logger.py # 日志配置
|
||||
├── .env # 配置文件
|
||||
├── .gitignore # 已包含 logs/
|
||||
└── start.bat # 启动脚本
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 更新日志
|
||||
|
||||
- 2026-03-02: 修复 intents 配置错误(4014)
|
||||
- 2026-03-02: 修复日志文件位置
|
||||
- 2026-03-02: 修复 logger 导入错误
|
||||
68
docs/PROJECT_REFACTOR.md
Normal file
68
docs/PROJECT_REFACTOR.md
Normal file
@@ -0,0 +1,68 @@
|
||||
# 项目结构整理完成
|
||||
|
||||
## 整理内容
|
||||
|
||||
### ✅ 已完成的工作
|
||||
|
||||
1. **重构目录结构**
|
||||
- 创建 `src/` 源代码目录
|
||||
- 按功能模块划分:`core/`、`handlers/`、`utils/`
|
||||
- 预留 `ai/` 目录用于后续AI集成
|
||||
- 创建 `logs/` 和 `data/` 目录
|
||||
|
||||
2. **清理冗余文件**
|
||||
- 删除 `start.sh`(Linux启动脚本,项目在Windows环境)
|
||||
- 删除 `start_simple.bat`(简化版启动脚本)
|
||||
- 移除 `colorlog` 依赖(未使用)
|
||||
|
||||
3. **优化核心文件**
|
||||
- 创建统一入口 `main.py`
|
||||
- 更新 `start.bat` 启动脚本
|
||||
- 简化 `requirements.txt`(只保留必需依赖)
|
||||
- 优化日志模块(日志文件统一存放到 `logs/` 目录)
|
||||
|
||||
4. **完善项目文档**
|
||||
- 更新 `README.md`(包含新的项目结构说明)
|
||||
- 更新 `.gitignore`(添加日志和数据目录)
|
||||
- 为 AI 模块创建规划文档
|
||||
|
||||
5. **模块化改造**
|
||||
- 为所有模块添加 `__init__.py`
|
||||
- 统一导入路径
|
||||
- 保持代码整洁和可维护性
|
||||
|
||||
## 新的项目结构
|
||||
|
||||
```
|
||||
QQbot/
|
||||
├── src/ # 源代码
|
||||
│ ├── core/ # 核心模块(bot、config)
|
||||
│ ├── handlers/ # 消息处理器
|
||||
│ ├── utils/ # 工具模块(logger)
|
||||
│ └── ai/ # AI模块(预留)
|
||||
├── logs/ # 日志文件
|
||||
├── data/ # 数据文件
|
||||
├── main.py # 程序入口
|
||||
├── start.bat # 启动脚本
|
||||
└── requirements.txt # 依赖列表
|
||||
```
|
||||
|
||||
## 后续AI接入建议
|
||||
|
||||
在 `src/ai/` 目录下可以创建:
|
||||
- `client.py` - AI客户端封装
|
||||
- `prompts.py` - 提示词管理
|
||||
- `context.py` - 对话上下文管理
|
||||
- `models/` - 不同AI模型的配置
|
||||
|
||||
## 启动方式
|
||||
|
||||
```bash
|
||||
# Windows
|
||||
start.bat
|
||||
|
||||
# 或直接运行
|
||||
python main.py
|
||||
```
|
||||
|
||||
项目现在更加整洁、模块化,便于后续扩展和维护!
|
||||
51
docs/README.md
Normal file
51
docs/README.md
Normal file
@@ -0,0 +1,51 @@
|
||||
# AI模型接入系统 - 文档索引
|
||||
|
||||
## 📚 文档列表
|
||||
|
||||
### 快速开始
|
||||
- [配置指南](CONFIG_GUIDE.md) - **从这里开始!** 详细的配置说明
|
||||
- [快速开始](AI_QUICKSTART.md) - 5分钟快速上手
|
||||
|
||||
### 详细文档
|
||||
- [完整文档](../src/ai/docs/README.md) - 所有功能的详细说明
|
||||
- [实现总结](AI_IMPLEMENTATION.md) - 技术实现细节
|
||||
- [功能总结](AI_SUMMARY.md) - 功能概览
|
||||
|
||||
## 🎯 根据需求选择文档
|
||||
|
||||
### 我是新手,想快速开始
|
||||
1. 先看 [配置指南](CONFIG_GUIDE.md) 了解如何配置
|
||||
2. 再看 [快速开始](AI_QUICKSTART.md) 运行第一个示例
|
||||
|
||||
### 我想了解所有功能
|
||||
查看 [完整文档](../src/ai/docs/README.md)
|
||||
|
||||
### 我想了解技术实现
|
||||
查看 [实现总结](AI_IMPLEMENTATION.md)
|
||||
|
||||
### 我想快速了解有哪些功能
|
||||
查看 [功能总结](AI_SUMMARY.md)
|
||||
|
||||
## 📁 目录结构
|
||||
|
||||
```
|
||||
docs/
|
||||
├── README.md # 本文件 - 文档索引
|
||||
├── CONFIG_GUIDE.md # 配置指南(重要!)
|
||||
├── AI_QUICKSTART.md # 快速开始
|
||||
├── AI_IMPLEMENTATION.md # 实现总结
|
||||
└── AI_SUMMARY.md # 功能总结
|
||||
|
||||
src/ai/docs/
|
||||
└── README.md # 完整文档
|
||||
|
||||
skills/docs/
|
||||
└── (技能相关文档)
|
||||
```
|
||||
|
||||
## 🔗 外部资源
|
||||
|
||||
- [OpenAI API文档](https://platform.openai.com/docs)
|
||||
- [Anthropic API文档](https://docs.anthropic.com)
|
||||
- [DeepSeek API文档](https://platform.deepseek.com/docs)
|
||||
- [QQ机器人文档](https://bot.q.qq.com/wiki/)
|
||||
21
docs/README_INDEX.md
Normal file
21
docs/README_INDEX.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# 文档目录
|
||||
|
||||
本目录包含项目的所有文档。
|
||||
|
||||
## 文档列表
|
||||
|
||||
- [README.md](./README.md) - 项目完整说明文档
|
||||
- [PROJECT_REFACTOR.md](./PROJECT_REFACTOR.md) - 项目结构整理记录
|
||||
- [AGENTS.md](./AGENTS.md) - AI技能配置说明
|
||||
|
||||
## 快速导航
|
||||
|
||||
### 新手入门
|
||||
1. 查看 [README.md](./README.md) 了解项目基本信息
|
||||
2. 按照文档配置环境和机器人
|
||||
3. 运行 `start.bat` 启动机器人
|
||||
|
||||
### 开发者
|
||||
- 项目结构说明:[PROJECT_REFACTOR.md](./PROJECT_REFACTOR.md)
|
||||
- AI集成规划:查看 `src/ai/README.md`
|
||||
- 技能配置:[AGENTS.md](./AGENTS.md)
|
||||
Reference in New Issue
Block a user