diff --git a/.github/workflows/compile-and-deploy.yml b/.github/workflows/compile-and-deploy.yml deleted file mode 100644 index 041a03e4..00000000 --- a/.github/workflows/compile-and-deploy.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: 编译并部署 - -on: - workflow_dispatch: - -jobs: - compile-and-deploy: - runs-on: ubuntu-latest - steps: - - name: 检出 - uses: actions/checkout@v4 - - name: 编译 - run: | - sudo apt-get update - sudo apt-get install -y --no-install-recommends zip - docker run --rm -v ${PWD}:/docs registry-hk.fit2cloud.com/public/mkdocs-material:latest build - zip -r -q -9 site.zip site - ls -la site.zip - - name: 上传 - uses: appleboy/scp-action@v0.1.7 - with: - host: ${{ secrets.MAXKB_DOCS_HOST }} - username: ${{ secrets.MAXKB_DOCS_HOST_USERNAME }} - port: 22 - key: ${{ secrets.MAXKB_DOCS_HOST_KEY }} - source: "site.zip" - target: /tmp - - name: 部署 - uses: appleboy/ssh-action@v1.0.3 - with: - host: ${{ secrets.MAXKB_DOCS_HOST }} - username: ${{ secrets.MAXKB_DOCS_HOST_USERNAME }} - key: ${{ secrets.MAXKB_DOCS_HOST_KEY }} - port: 22 - script: | - cd /tmp - rm -rf site - unzip site.zip - rm -rf /opt/maxkb/docs/* - mv /tmp/site/* /opt/maxkb/docs - /opt/nginx/bin/reload-nginx.sh - rm -rf /tmp/site* diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 89c43264..00000000 --- a/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.idea/ -*.iml -target/ -.vscode -.DS_Store diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/LICENSE b/LICENSE deleted file mode 100644 index f288702d..00000000 --- a/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/README.md b/README.md deleted file mode 100644 index e3bdfc2a..00000000 --- a/README.md +++ /dev/null @@ -1,47 +0,0 @@ -本仓库保存了 [MaxKB 项目]() 的 [官方文档](https://fit2cloud.com/maxkb/docs/),该文档使用 [MkDocs]() 文档框架下的 [Material for MkDocs]() 主题进行构建。 - -## 本地开发 - -### 克隆本仓库 -```bash -git clone git@github.com:1Panel-dev/MaxKB-docs.git -``` - -### 安装依赖 -```bash -cd MaxKB-docs -pip install -r requirements/requirements.txt -``` - -### 修改文档内容 -本文档的文档结构定义在 `mkdocs.yml` 文件中,文档的具体内容均在 `docs` 目录中。 -文档内容使用 markdown 语法编写,若要添加新的文档,需要先在 `mkdocs.yml` 文件中的 `nav` 部分增加对应章节导航。 - -### 本地调试文档 -```bash -mkdocs serve -``` -执行上述命令后,可通过 `http://127.0.0.1:8000` 地址查看生成的文档内容,当修改文档后,页面内容会自动更新。 - -### 构建文档 -```bash -mkdocs build -``` - -执行上述命令后,会在 `site` 目录下生成文档站点的静态文件,将目录中的内容复制到任意 HTTP 服务器上即可完成文档的部署。 - -## 帮助完善文档 - -### Fork 文档仓库 -点击仓库右上角的 `fork` 按钮,复制本仓库到自己的 github 账号。 - -### 克隆 fork 后的仓库 -```bash -git clone https://github.com/your-github-account/MaxKB-docs.git -``` - -### 本地修改并调试 - -### Push 修改内容到 GitHub 仓库 - -### 提交 Pull Request 到本仓库 diff --git a/docs/changelog.md b/docs/changelog.md deleted file mode 100644 index d3939063..00000000 --- a/docs/changelog.md +++ /dev/null @@ -1,766 +0,0 @@ -## 1 版本说明 - -!!! Abstract "" - **版本号说明:** 像其它优秀开源项目一样,MaxKB 将保持每月发布一个新的功能版本,功能版本中如遇较为紧急或严重的 Bug,将及时推出 Bug 修复的小版本。 - **MaxKB 版本号命名规则为:** v 大版本.功能版本. Bug 修复版本,示例如下: - - - v1.0.1 是 v1.0.0 之后的 Bug 修复版本 - - v1.1.0 是 v1.0.0 之后的功能版本 - -## 2 更新内容 - -### v1.10.2 - -2025 年 3 月 6 日 - -!!! Abstract "新增功能 :star2:" - - 应用:应用接入新增支持对接Slack。(X-Pack) - - 应用:新增变量赋值节点。 - - 函数库:支持导入/导出函数。 - - 模型设置:新增支持Ollama供应商的重排模型。 - -!!! Abstract "功能优化 :sunflower:" - - 应用:开启思考过程后,优化在企业微信、飞书、钉钉、公众号中的回复过程。(X-Pack) - - 应用:企业微信对话时支持上传图片。(X-Pack) - - 应用:登录认证的OIDC设置支持配置scope参数。(X-Pack) - - 应用:支持创建空白应用。 - - 应用:用户输入的参数新增支持密码框和开关组件。 - - 应用:用户输入支持自定义标题。 - - 应用:表单收集节点的参数新增支持密码框组件。 - - 应用:上传音频文件类型新增m4a格式。 - - 应用:通过调用应用API Key的方式进行对话时,支持上传文件参数。 - - 应用:通过调用应用API Key的方式进行对话时,支持输出思考过程参数。 - - 应用:基础信息节点中的用户输入表格中的参数,支持拖拽式调整顺序。 - - 应用:判断器中的条件值支持变量解析。 - - 应用:在多路召回节点的“执行详情”对话框中,优化分段显示内容(包含分段标题、文档和知识库)。 - - 应用:当用户退出工作流编辑时提示用户保存数据。 - - 应用:关联知识库引用分段数的最大值调整为10000。 - - 应用:高级编排中修改节点名称的操作修改为“…”→“重命名”。 - - 应用:单一图片生成节点生成多张图片时横向排列图片。 - - 问答页面:优化问答页面布局为左右布局,左侧显示AI回答,右侧显示用户问题。 - - 问答页面:优化用户打开问答页面时,显示历史对话记录。 - - 问答页面:优化语音播放时仅播放最后一个内容。 - - 问答页面:支持修改会话标题。 - - 知识库:支持执行生成问题失败的分段继续生成问题。 - - 知识库:支持为文档列表排序。 - - 知识库:支持在生成问题中使用{title}变量获取分段标题。 - - 函数库:查询函数时忽略大小写。 - - 模型设置:查询模型时忽略大小写。 - - 团队成员:查询成员时忽略大小写。 - - 系统:优化第一次登录时耗时较长的问题。 - -!!! Abstract "问题修复 :palm_tree:" - - 应用:修复AI回复内容中的图片无法放大的问题。 - - 应用:修复高级编排中的提示词窗口放大后编辑内容,按ESC键关闭窗口后不保存提示词的问题。 - - 应用:修复使用vLLM供应商大语言模型进行对话时,部分情况下回答无法结束的问题。 - - 应用:修复使用Kimi供应商的大语言模型进行对话时,Tokens计算不准确的问题。 - - 应用:修复图片生成节点切换模型后参数设置未更新的问题。 - - 应用:修复当Excel表格中含有合并单元格的数据时,读取时会缺少数据的问题。 - - 应用:修复OpenAI调用格式没有思考过程参数的问题。 - - 应用:修复应用子节点中若有非必填参数,在父级应用中若未设置该参数,对话时会报错的问题。 - - 应用:修复Ollama供应商的大语言模型使用num_ctx参数时,进行对话会报错的问题。 - - 问答页面:修复在历史对话记录中,无法使用浏览器进行语音播放的问题。 - - 问答页面:修复新建对话后第一次提问时,刷新页面会删除当前对话的问题。 - - 问答页面:修复问题框中无法在内容中间插入换行的问题。 - - 问答页面:修复显示设置中关闭历史记录后,问答页面的新建对话不显示的问题。(X-Pack) - - 问答页面:修复部分情况下会在文档的URL地址后面自动加上“/”,导致无法访问的问题。 - - 函数库:修复函数返回值为0时,调试时的输出结果显示错误的问题。 - - 模型设置:修复添加阿里云百炼的大语言模型时,如果是全模态模型提交会报错的问题。 - - 模型设置:修复 Azure OpenAI 供应商添加DeepSeek-R1 模型报错的问题。 - - 系统设置:修复Swagger文档中接口参数显示不全的问题。(X-Pack) - - 系统设置:修复外观设置中设置网站名称后问答页面不显示应用名称的问题。(X-Pack) - - 系统设置:修复登录页面加载时,默认Logo会闪现的问题。(X-Pack) - -### v1.10.1 - -2025 年 2 月 13 日 - -!!! Abstract "新增功能 :star2:" - - 模型设置:新增腾讯云知识引擎原子能力供应商的大语言模型。 - -!!! Abstract "功能优化 :sunflower:" - - 应用:优化高级编排应用中当节点数过多时,打开工作流编排页面较慢的问题。 - - 应用:优化发送给AI模型的历史聊天记录中过滤掉表单数据,避免影响AI回答。 - - 应用:优化输出思考设置的描述。 - - 应用:优化高级编排应用中,调试预览的对话窗口只有点击“关闭”按钮时才会被关闭。 - -!!! Abstract "问题修复 :palm_tree:" - - 知识库:修复上传文件时设置标题为关联问题时,实际未关联成功的问题。 - - 知识库:修复上传的文件夹中包含子文件夹时,上传报错的问题。 - - 知识库:修复上传的文件夹中包含隐藏文件时,上传报错的问题。 - - 应用:修复执行详情中文档内容提取节点显示错误文案的问题。 - - 应用:修复上传的Excel文档有空白sheet时,导致文档内容提取节点报错的问题。 - - 应用:修复偶发性回复"抱歉,没有查找到相关内容,请重新描述您的问题或提供更多信息。"的问题。 - - 应用:应用达到提问次数上限后,英文的提示信息不正确。 - - 应用:修复导出的对话日志文件中列名显示不准确的问题。 - - 应用:修复显示设置中点击“恢复默认”后,不能设置主题色和头部字体颜色的问题。(X-Pack) - - 应用:修复显示设置中点击“恢复默认”后,语言会显示null或undefined的问题。(X-Pack) - - 系统设置:修复非组织下钉钉用户也能扫码登成功的问题。(X-Pack) - - 系统设置:修复钉钉用户扫码登录后,用户邮箱信息获取不全的问题。(X-Pack) - - 系统设置:修复平台设置预览中不应该有语言设置操作的问题。(X-Pack) - - - -### v1.10.0 - -2025 年 2 月 10 日 - -!!! Abstract "新增功能 :star2:" - - 应用:针对DeepSeek R1深度思考功能的发布,MaxKB对应新增“输出思考”配置功能。 - - 应用:鉴于不同供应商所提供的思考过程标识存在差异,MaxKB支持用户依据所选用的具体模型,自定义思考过程的标签。 - - 应用:支持语音输入自动发送。 - - 应用:支持语音自动播放。 - - 应用:显示设置中新增问答页面的语言设置。 - - 模型设置:支持SILICONFLOW供应商的大语言模型、向量模型、重排模型、语音识别和图片生成模型。 - - 模型设置:支持Anthropic供应商的大语言模型和视觉模型。 - - 模型设置:支持vLLM供应商的向量模型和图片理解模型。 - - 模型设置:支持豆包供应商的向量模型。 - - 系统管理:支持系统语言切换,首批支持简体中文、繁体中文和英文三种语言。 - -!!! Abstract "功能优化 :sunflower:" - - 应用:优化用户提问时上传文件的样式显示问题。 - - 应用:针对AI回复内容可以右键引用或复制。 - -!!! Abstract "问题修复 :palm_tree:" - - 知识库:修复上传离线文件时,文件名超过128个字符报错的问题。 - - 应用:修复在企业微信中提问回复内容不全的问题。(X-Pack) - - 应用:修复开场白超过4096个字符报错的问题。 - - 应用:修复问答页面新建对话后,上传文档无法读取文档内容的问题。 - - 应用:修复添加的应用子节点中的参数未实时更新的问题。 - - - -### v1.9.1 - -2025 年 1 月 9 日 - -!!! Abstract "功能优化 :sunflower:" - - 知识库:文档向量化时支持仅向量化非成功的分段。 - - 应用:通过第三方应用进行对话的日志,优化为按天记录每个用户的对话日志。(X-Pack) - -!!! Abstract "问题修复 :palm_tree:" - - 应用:修复进行语音输入时,提示中图片加载失败的问题。 - - 应用:修复嵌入应用节点,设置变量参数后,保存不生效的问题。 - - 应用:修复部分网络环境下使用图片理解模型对话结束后,提示Connection aborted的问题。 - - 应用:修复判断器节点的执行条件设置为any时不生效的问题。 - - 应用:修复添加图片理解和图片生成模型时,不能自定义输入基础模型的问题。 - - 应用:修复部分情况下在执行详情中会遗漏执行节点的问题。 - - -### v1.9.0 - -2025 年 1 月 2 日 - -!!! Abstract "新增功能 :star2:" - - 应用:新增图片生成节点。 - - 应用:支持上传音频文件,新增语音转文本节点。 - - 应用:新增文本转语音节点。 - - 应用:支持导出和导入应用。 - - 应用:工作流节点支持设置执行条件。 - - 应用:支持接入企业微信的微信客服。(X-Pack) - - 应用:公众号、企业微信、微信客服支持语音提问和语音回答。(X-Pack) - - 知识库:知识库和文档支持导出Excel文件与离线图片的ZIP包。 - - 知识库:上传文档选择文本文件类型时,新增XLS、XLSX、CSV、ZIP文件格式。 - - 知识库:上传文档选择QA问答对类型时,新增ZIP文件格式。 - - 模型设置:创建模型时,支持设置模型参数。 - - 模型设置:图片理解和图片生成模型支持设置模型参数。 - - 模型设置:图片理解模型新增支持Xinference、Ollama、豆包、阿里云百炼、Azure OpenAI、Gemini供应商。 - - 模型设置:图片生成模型新增支持Xinference、OpenAI、腾讯混元、通义千问、智谱AI、豆包、阿里云百炼、Azure OpenAI供应商。 - - 模型设置:向量模型新增支持Azure OpenAI供应商。 - - 模型设置:语音识别模型新增支持Azure OpenAI供应商。 - - 模型设置:语音合成模型新增支持Azure OpenAI供应商。 - -!!! Abstract "功能优化 :sunflower:" - - 应用:基本信息节点中的“用户输入“参数,添加参数时支持设置“显示默认值”选项。 - - 应用:表单收集节点的参数支持设置“显示默认值”选项。 - - 应用:对话URL支持携带“question=问题”参数,打开对话页面时自动发送问题。 - - 应用:上传图片时自动生成“请解析图片内容”的问题。 - - 应用:优化工作流节点的执行效率。 - - 知识库:文档列表支持批量取消向量化和批量取消生成问题。 - - 模型设置:Amazon Bedrock供应商添加大语言模型时,支持ProxyURL参数。 - -!!! Abstract "问题修复 :palm_tree:" - - 安全:修复函数库模块中远程命令执行的安全漏洞(CVE-2024-56137)。 - - 应用:修复浮窗对话框中不显示“新建对话”按钮的问题。 - - 应用:修复浮窗对话框右上角的icon颜色不一致的问题。 - - 应用:修复历史应用进行对话时会提示“缺少上下文类型”错误的问题。 - - 应用:修复使用低版本浏览器进行对话时报错的问题。 - - 应用:修复执行复杂工作流时,在部分情况下会漏执行节点的问题。 - -### v1.8.1 - -2024 年 12 月 12 日 - -!!! Abstract "新增功能 :star2:" - - 应用:AI对话节点的历史聊天记录可设置工作流和节点的上下文。 - - 模型管理:支持智谱AI供应商的图片理解模型。 - -!!! Abstract "功能优化 :sunflower:" - - 应用:语音播放时过滤表单数据。 - - 系统:优化部分页面的显示样式。 - -!!! Abstract "问题修复 :palm_tree:" - - 应用:按名称筛选结果后,不加载数据的问题。 - - 应用:修复浮窗图标尺寸过大时会被引导图遮盖的问题。 - - 知识库:修复文档按状态筛选结果错误的问题。 - - 知识库:修复拥有查看权限的成员可以导出文档的问题。 - - 知识库:修复拥有查看权限的成员可以修改分段启用/禁用状态的问题。 - - 知识库:修复上传无目录结构的PDF文件,只能识别第一页内容的问题。 - - 系统管理:修复Swagger文档中的Web站点知识库缺少参数的问题。(X-Pack) - - 系统管理:修复企业微信扫码登录配置错误的问题。(X-Pack) - -### v1.8.0 - -2024 年 12 月 5 日 - -!!! Abstract "新增功能 :star2:" - - 应用:用户提问时支持上传文档和图片。 - - 应用:工作流新增文档内容提取节点。 - - 应用:工作流新增图片理解节点。 - - 应用:工作流新增表单收集节点。 - - 应用:工作流支持嵌入应用节点。 - - 应用:工作流画布支持收起或展开全部节点以及一键美化布局。 - - 应用:基础节点的用户输入参数中,支持多选框和选项卡组件。 - - 应用:开场白支持HTML渲染。 - - 应用:支持批量将对话日志添加到知识库。 - - 应用:支持按创建者显示应用。 - - 知识库:支持按创建者显示知识库。 - - 函数库:支持按创建者显示函数。 - - 模型设置:支持通义千问供应商的图片理解模型。 - - 模型设置:支持OpenAI供应商的图片理解模型。 - - 模型设置:支持腾讯混元供应商的图片理解模型。 - - 模型设置:支持阿里云百炼供应商的大语言模型。 - - 系统管理:支持OAuth2单点登录方式。(X-Pack) - -!!! Abstract "功能优化 :sunflower:" - - 知识库:优化文档状态,显示向量化和生成问题的进度详情。 - - 应用:基础节点的用户输入参数中,单选框组件支持标签、选项值的设置方式。 - - 应用:对话详情页面对AI回复内容进行标注时,保留上一次所选的知识库文档。 - - 应用:优化对话日志列表的显示顺序,按最近对话时间降序排序。 - - 应用:优化打开对话详情时,默认显示最新对话记录。 - -!!! Abstract "问题修复 :palm_tree:" - - 知识库:修复PDF文档中若包含不能识别的特殊字符时,上传文档会报错的问题。 - - 知识库:修复部分情况下为“成功”状态的文档生成问题时,无法下发任务的问题。 - - 知识库:修复由于网站编码问题,导致web站点知识库无法获取文本内容的问题。 - - 系统管理:修复拥有知识库管理权限的成员,无法查看知识库的问题。 - - 系统管理:修复拥有应用查看权限的成员,能够修改应用接入配置的问题。(X-Pack) - -### v1.7.2 - -2024 年 11 月 15 日 - -!!! Abstract "问题修复 :palm_tree:" - - 应用:修复显示设置中自定义上传的用户头像、AI回复头像图片显示变形的问题。 - - 应用:修复工作流中知识库检索节点收起后,无法发布应用的问题。 - - 应用:修复AI模型的参数设置中,若删除温度或最大输出 Tokens 参数,无法发布应用的问题。 - - 应用:修复应用中关联的知识库名称过长时,偶然不显示 tooltips 的问题。 - - 应用:修复应用列表中查询结果显示不正确的问题。 - - -### v1.7.1 - -2024 年 11 月 8 日 - - -!!! Abstract "功能优化 :sunflower:" - - 应用:高级编排应用中保存节点的收起/展开状态。 - -!!! Abstract "问题修复 :palm_tree:" - - 应用:修复应用接入认证过的公众号,提问时不回复的问题。 - - 应用:修复应用接入公众号配置页面的样式问题。 - - 应用:函数中设置了非必填参数,在应用中引用该函数时,若未传值执行会报错的问题。 - - 应用:修复工作流中所有节点未打开返回内容时,无法查看执行详情的问题。 - - 应用:修复直接回答分段内容显示问题。 - - 应用:修复应用发布后,提问时未使用最新发布的应用配置的问题。 - - 知识库:修复导入DOCX文档时,在部分情况下无法识别图片问题。 - - 问答页面:修复AI回答时,若返回的MarkDown表格中含有图片内容会导致显示错位的问题。 - - 系统设置:修复团队成员的权限设置中,搜索后点击“全选”,会选中全部而不是搜索后的内容。 - - 模型管理:修复添加Xinference向量模型时,提示 API 域名无效的问题。 - - - -### v1.7.0 - -2024 年 10 月 31 日 - -!!! Abstract "新增功能 :star2:" - - 【知识库】支持知识库文档自动生成关联问题。 - - 【应用】工作流节点支持多进多出。 - - 【应用】支持设置语音播放的声音和语速。 - - 【应用】支持查看和恢复历史版本。 - - 【应用】支持设置对话日志的清除策略。 - - 【应用】高级编排应用支持自动保存设置,默认不开启,开启后默认5分钟保存一次。 - - 【应用】工作流编排界面在添加组件时支持按名称查询组件。 - - 【模型设置】支持自定义大语言模型和语音合成模型的参数。 - - 【模型设置】支持按模型类型、创建人、权限查询模型。 - - 【模型设置】模型面板中增加创建人信息。 - - 【模型设置】支持阿里云百炼的向量模型。 - - 【模型设置】支持 Amazon Bedrock 的向量模型。 - - 【模型设置】支持腾讯混元的向量模型。 - - 【模型设置】支持讯飞星火的向量模型。 - - 【模型设置】支持百度千帆的向量模型。 - - 【模型设置】支持阿里云百炼的语音识别和语音合成模型。 - - 【模型设置】支持 Xinference 的语音识别和语音合成模型。 - - 【问答页面】支持个性化显示设置。(X-Pack) - - 【问答页面】支持身份验证。(X-Pack) - - 【系统设置】支持企业微信、钉钉、飞书扫码登录。(X-Pack) - -!!! Abstract "功能优化 :sunflower:" - - 【应用】基础节点的全局变量优化为用户输入和接口传参两个参数表单。 - - 【应用】关联知识库时支持按名称查询知识库。 - - 【应用】关联知识库的名称过长时增加悬浮显示。 - - 【应用】知识库检索结果 和 满足直接回答的分段内容中包含分段标题。 - - 【应用】导出高级编排应用时包含知识库检索节点的引用分段数据。 - - 【应用】在语音输入时,控制台不再输出调试信息。 - - 【函数库】优化函数中 Python 编辑器组件,使得编写函数体验更友好。 - - 【团队管理】设置资源权限时增加全选按钮。 - - 【模型设置】创建模型时,支持按模型类型筛选供应商。 - - 【模型设置】优化供应商列表的显示顺序和分类,将供应商划分为公有模型供应商和私有模型供应商。 - - 【系统设置】优化修改密码的逻辑,先验证两次密码是否一致,再发邮件验证码。 - -!!! Abstract "问题修复 :palm_tree:" - - 【知识库】修复导入 License 文件后,会显示一次 License 过期的提示的问题。 - - 【知识库】修复当导出空知识库时,打开导出文件报错的问题。 - - 【知识库】修复当知识库文档中图片不存在时,AI 回复内容显示异常的问题。 - - 【知识库】修复在知识库上传 DOCX 文件后,部分情况下图片未正常导入的问题。 - - 【知识库】修复在知识库上传 PDF 文件,选择高级分段时,设置分段长度不生效的问题。 - - 【知识库】修复在知识库分段中插入 MarkDown 流程图,不显示文本内容的问题。 - - 【应用】修复当应用使用的模型为豆包智能体模型时,接入企业微信提问不回复的问题。 - - 【应用】修复知识来源引用分段的文件名过长时,界面显示错乱的问题。 - - 【应用】修复在接入的公众号中提问时,若回复内容在图片后面有文本内容, 无法返回图片的问题。 - - 【模型管理】修复添加 Xinference 模型时,如果模型名称和 ID 不一致,无法添加模型的问题。 - - 【模型管理】修复添加 Xinference 模型时,没有传认证参数导致提示 API 域名无效的问题。 - - -### v1.6.1 - -2024 年 09 月 29 日 - -!!! Abstract "问题修复 :palm_tree:" - - 【应用】修复使用AWS模型进行对话时报错的问题。 - - 【应用】修复升级后第一次进入高级编排应用编辑页面,显示空白的问题。 - - 【应用】修复高级编排应用设置全局变量后,打开调试对话框,选择变量后调试对话框会被关闭的问题。 - - 【应用】修复关联知识库中,知识库名称过长导致显示不全的问题。 - - 【知识库】修复分段内容超过单元格最大长度时,导出报错的问题。 - -### v1.6.0 - -2024 年 09 月 27 日 - -!!! Abstract "新增功能 :star2:" - - 【应用】支持语音方式问答。 - - 【应用】支持使用重排模型进行多路召回。 - - 【应用】支持自定义全局变量。 - - 【应用】支持标准 OpenAI 格式对话。 - - 【应用】支持渲染 ECharts 图表和 HTML 页面。 - - 【知识库】支持上传 Excel 和 CSV 表格文档。 - - 【知识库】支持对多个文档进行批量重新向量化操作。 - - 【知识库】支持问题批量关联分段。 - - 【函数库】】支持自定义设置函数权限与状态。 - - 【模型管理】】支持对接豆包、讯飞星火、OpenAI 供应商的语音识别、语音合成模型。 - - 【模型管理】】支持对接阿里云百炼、Xinference 以及本地模型的重排模型。 - - 【应用】支持一键接入企业微信、钉钉、飞书和微信公众号。(X-Pack) - - 【外观设置】支持自定义主题色、项目信息等设置。(X-Pack) - -!!! Abstract "功能优化 :sunflower:" - - 【知识库】PDF文档支持按目录章节进行分段。 - - 【应用】AI模型的参数设置中最大输出Tokens的最大值调整为10万,由用户自行控制大小。 - - 【应用】优化简易应用的设置,提示词分为无引用知识库提示词和引用知识库提示词。 - - 【应用】简易应用的问题优化调整至关联知识库的参数设置中,且支持设置提示词。 - - 【应用】简易应用的多轮对话调整为历史聊天记录,可以自定义设置历史记录数。 - - 【应用】简易应用调试预览的应用Logo可以自定义上传应用头像。 - - 【应用】高级编排应用的节点支持展开和收起,节省画布空间。 - - 【应用】高级编排应用点击节点右侧“+ ”号可直接添加节点。 - - 【应用】新增系统变量历史聊天记录和对话ID。 - - 【应用】对话日志详情中修改标注内容时支持Markdown样式编辑。 - - 【问答页面】优化换个答案按钮的图标。 - - 【用户管理】优化创建用户的用户名规则。 - - 【系统】优化弹窗只能点击“保存”或者“关闭”选项退出,避免编辑过程中误退出情况的发生。 - -!!! Abstract "问题修复 :palm_tree:" - - 【知识库】修复向MaxKB上传语雀导出的Word文档时,导入内容是空白的问题。 - - 【知识库】修复上传空白PDF文件报错的问题。 - - 【应用】修复开启多轮对话时,提问30秒以上不携带历史对话记录的问题。 - - 【应用】修复AI模型的参数设置中最大输出Tokens的提示描述错误的问题。 - - 【应用】修复通过应用的API Key进行对话时,若stream设置为false会报错的问题。 - - 【应用】修复在AI对话节点对调用的腾讯混元模型进行角色设定时,对话报错的问题。 - - 【团队成员】修复团队成员过多时会出现超出边界的问题。 - -### v1.5.1 - -2024 年 08 月 29 日 - -!!! Abstract "问题修复 :palm_tree:" - - 【应用】修复在应用设置中点击发布提示温度参数未设置的问题。 - - 【应用】修复使用本地模型进行提问时,获取tokens报错问题。 - -### v1.5.0 - -2024 年 08 月 28 日 - -!!! Abstract "新增功能 :star2:" - - 【函数库】支持函数功能。 - - 【高级应用】工作流编排支持添加函数库中函数节点。 - - 【应用】支持复制应用。 - - 【应用】支持设置AI模型的temperature和max_tokens参数。 - - 【模型管理】支持对接豆包大模型。 - - 【模型管理】支持对接Amazon Bedrock 的大模型。 - - 【模型管理】支持对接腾讯混元大模型。 - - 【模型管理】支持对接 vLLM 大模型。 - - 【模型管理】支持对接 Xinference 大模型。 - - 【系统设置】支持 CAS 认证方式。(X-Pack) - - 【系统设置】支持 OIDC 认证方式。(X-Pack) - -!!! Abstract "功能优化 :sunflower:" - - 【知识库】优化文档向量化性能。 - - 【知识库】优化PDF文档的智能分段效果。 - - 【应用】优化应用名称过滤前后空格。 - -!!! Abstract "问题修复 :palm_tree:" - - 【系统】修复Django JSONField存在SQL注入漏洞(CVE-2024-42005)。 - - 【知识库】修复文档设置直接回答时相似度写0.000,提示设置成功,实际上不生效的问题。 - - 【知识库】修复智能分段时,单个段落超出10w字符报错的问题。 - - 【应用】修复对话日志导出报错的问题。 - - 【应用】修复编排页面AI对话节点提示词无法选中的问题。 - - 【应用】修复编排页面鼠标定位在AI对话节点的提示词中放大缩小事件冲突问题。 - - 【模型管理】修复模型名称前后端校验不统一问题。 - - 【模型管理】修复无法添加智谱AI模型的问题。 - - 【外观设置】修复登录图片设置上传大尺寸图片报错的问题。(X-Pack) - - 【外观设置】修复自定义外观设置后,还会显示默认外观的问题。(X-Pack) - -### v1.4.1 - -2024 年 08 月 08 日 - -!!! Abstract "新增功能 :star2:" - - 【应用】显示设置中自定义对话头像和浮窗入口图标支持GIF格式。(X-Pack) - - 【应用编排】指定回复和AI对话节点新增返回内容设置。 - -!!! Abstract "功能优化 :sunflower:" - - 【应用编排】优化开场白和提示词的编辑框支持放大。 - - 【问答页面】用户问题提问后显示换行格式。 - -!!! Abstract "问题修复 :palm_tree:" - - 【应用】修复使用讯飞星火模型,当多用户同时提问后,回答内容会错乱的问题。 - - 【应用】修复在设置页面提问时,多轮对话设置不生效的问题。 - - 【应用】修复当应用只有使用权限,在高级编排页面一直提示没有权限的问题。 - - 【知识库】修复修改关联问题报错的问题。 - - 【知识库】修复添加分段时上传超大像素图谱报错的问题。 - - 【知识库】修复上传PDF问答后,部分内容丢失的问题。 - - 【知识库】创建Web站点知识库,选择向量模型不生效的问题。 - - 【知识库】修复上传QA问答对文件时,当表格中只有数字,获取数据失败的问题。 - - 【知识库】修复文档被删除后依然执行向量化的问题。 - - 【模型管理】修复模型名称设置超过20个字符报错的问题。 - -### v1.4.0 - -2024 年 07 月 31 日 - -!!! Abstract "新增功能 :star2:" - - 【知识库】支持创建空知识库。 - - 【知识库】创建和设置知识库时支持选择不同的向量模型进行向量化。 - - 【模型管理】支持添加 OpenAI 、Ollama 和本地的向量模型。 - - 【模型管理】支持把模型权限设置为公用或私有。 - - 【应用】高级编排的指定回复节点支持快捷问题输出:`快捷问题`。 - - 【应用】支持设置浮窗模式的对话框入口图标。X-Pack) - - 【应用】支持自定义对话框的AI回复的头像。(X-Pack) - - 【应用】支持设置浮窗模式的对话框是否可拖拽位置。(X-Pack) - - 【应用】支持设置对话框是否显示历史记录。(X-Pack) - - 【系统设置】支持LDAP单点登录。(X-Pack) - - 【系统设置】支持自定义主题外观,设置系统的网站 logo、登录 logo、主题色、登录背景图、网站名称、欢迎语等。(X-Pack) - - 【系统设置】开放系统 API。(X-Pack) - -!!! Abstract "功能优化 :sunflower:" - - 【知识库】优化文档索引流程,提高知识点召回率。 - - 【知识库】调整分段内容最大长度为 10 万个字符。 - - 【应用】调整关联知识库时只能选择使用相同向量模型的知识库。 - - 【应用】显示知识来源调整至显示设置中。 - - 【模型管理】优化模型列表样式。 - - 【关于】优化关于页面显示信息。 - -!!! Abstract "问题修复 :palm_tree:" - - 【知识库】修复爬取Web网站文档时碰到无法访问页面时中断爬取任务的问题。 - - 【知识库】修复分段详情中关联问题过多时滚动条显示问题。 - - 【模型管理】修复在Ollama供应商有下载中模型时,切换到其他供应商的模型也变为下载中的问题。 - - 【问答页面】修复回答时若内容中包含代码不展开显示的问题。 - - 【问答页面】修复删除新建对话报错的问题。 - - - - -### v1.3.1 - -2024 年 07 月 16 日 - -!!! Abstract "问题修复 :palm_tree:" - - 【应用概览】打开 API 访问凭据的地址显示 404。 - - 【应用编排】判断器中删除其中一个条件分支后,再添加条件分支,前端顺序号未更新。 - - 【应用编排】判断器中的选择变量的滚动条不能拖动。 - - 【应用编排】执行详情中知识库检索结果的排序不对,未按相似度降序排序。 - - 【应用编排】指定回复的内容在任务流程中传递会返回空。 - - 【问答页面】当应用关联的知识库中含有禁用状态的文档时,提问后点换个答案不会换一批命中分段。 - - 【知识库】在线知识库爬取文档名超过 128 个字符报错。 - -### v1.3.0 - -2024 年 07 月 04 日 - -!!! Abstract "新增功能 :star2:" - - 【应用】支持创建简易配置和高级编排两种类型的应用,高级编排应用支持自定义工作流。 - - 【应用】高级编排的应用AI对话节点支持角色设定。 - - 【应用】高级编排的应用AI对话节点支持自定义设置携带的历史聊天记录数。 - - 【应用】高级编排的应用支持获取当前时间的系统变量。 - - 【对话日志】高级编排应用支持查看每个节点的执行详情。 - -!!! Abstract "问题修复 :palm_tree:" - - 【知识库】修复上传QA问答对时阻塞问题。 - - 【知识库】修复高级分段开启自动清洗后会把所有的换行符去掉的问题。 - - 【应用】修复提示词输入Json格式的内容时,提问会报错的问题。 - - -### v1.2.1 - -2024 年 06 月 14 日 - -!!! Abstract "新增功能 :star2:" - - 【问答页面】历史聊天记录支持逻辑删除。 - -!!! Abstract "功能优化 :sunflower:" - - 【问答页面】对话时文本输入框根据输入文本内容自适应高度。 - - 【应用】最大引用字符数调整为 10 万。 - - 【应用】对话时问题的最大字符数调整为 10 万。 - - 【应用】知识来源引用分段为 0 时也可打开详情。 - -!!! Abstract "问题修复 :palm_tree:" - - 【应用】解决应用 API 文档接口调用报错的问题。 - - 【应用】解决嵌入第三方全屏模式描述错误的问题。 - - 【知识库】解决导入带有表格样式的 md 文件分段后表格格式丢失的问题。 - - -### v1.2.0 - -2024 年 05 月 30 日 - -!!! Abstract "新增功能 :star2:" - - 【知识库】支持上传 Excel/CSV 格式的 QA 问答对,自动关联问题。 - - 【知识库】支持上传 HTML 格式的文本文件。 - - 【知识库】支持知识库和文档重新向量化操作。 - - 【知识库】支持导出知识库和文档。 - - 【问答页面】支持新建对话和查看历史对话。 - - 【问答页面】支持导出对话记录。 - -!!! Abstract "功能优化 :sunflower:" - - 【应用】显示知识来源的引用分段,支持 markdown 样式显示。 - - 【应用】提问后模型返回异常信息时也要记录到对话日志中。 - - 【应用】在对话日志详情中修正答案时,问题可以修改。 - - 【应用】引用分段数最大值调整为 100 。 - - 【应用】开场白最大字符数调整为 4096 。 - -!!! Abstract "问题修复 :palm_tree:" - - 【应用】解决开场白中无法显示 markdown 样式的表格。 - - 【问答页面】解决提问时出现【用户问题】此字段不能为空字符串的问题。 - - 【知识库】修复删除最后一个分段时报错的问题。 - - 【知识库】上传 md格式文档,一个分段内容超过 4096 个字符时,上传报错。 - - 【关于】修复刷新浏览器后不显示版本号的问题。 - - -### v1.1.3 - -2024 年 05 月 15 日 - -!!! Abstract "新增功能 :star2:" - - 【模型管理】支持对接 Gemini 供应商的模型。 - - 【模型管理】支持对接 DeepSeek 供应商的模型。 - - 【模型管理】OpenAI 供应商的基础模型增加 gpt-4o 模型。 - -!!! Abstract "功能优化 :sunflower:" - - 【知识库】文档问题列表的多选框优化增加可点击范围。 - -!!! Abstract "问题修复 :palm_tree:" - - 【知识库】文档删除或迁移分段后,字符数不会重新计算。 - - 【知识库】批量导入选中将标题添加关联问题,标题为空时报错 。 - - 【模型管理】Ollama 模型中没有已下载的模型时,在 MaxKB 添加 Ollama 模型报错。 - - 【模型管理】添加模型时,上次的表单未清空。 - -### v1.1.2 - -2024 年 05 月 10 日 - -!!! Abstract "新增功能 :star2:" - - 【知识库】上传文档时支持将标题添加为关联问题(适用标题是问题的问答对)。 - - 【知识库】支持分段迁移和批量迁移。 - - 【知识库】支持分段批量删除。 - - 【知识库】文档直接回答时支持相似度设置。 - - 【应用】 新增 API Key 跨域的设置。 - -!!! Abstract "功能优化 :sunflower:" - - 【知识库】上传文档的分段预览优化为懒加载方式,避免数据量大时浏览器崩溃。 - -!!! Abstract "问题修复 :palm_tree:" - - 【知识库】修复文档改名无法点击保存的问题。 - - 【知识库】修复导入文档时在特殊情况下导入失败。 - - 【用户管理】修复在创建新用户时,用户名含有 0 时校验不通过的问题。 - - 【UI】修复ui文件打包报错的问题。 - - -### v1.1.1 - -2024 年 04 月 30 日 -!!! Abstract "功能优化 :sunflower:" - - 【知识库】上传文档的超时时间延长为 1 小时。 - -!!! Abstract "问题修复 :palm_tree:" - - 【应用】修复未选择AI 模型时,开启问题优化提问报错的问题。 - - 【应用】修复未选择AI 模型时,开启多轮对话报错的问题。 - - 【知识库】修复文档上传失败时,点击重试按钮无效的问题。 - - 【知识库】修复相同类型的知识库直接文档无法迁移的问题。 - - -### v1.1.0 - -2024 年 04 月 29 日 - -!!! Abstract "新增功能 :star2:" - - 【知识库】新增全文检索和混合检索两种检索模式。 - - 【知识库】新增命中处理方式设置,支持设置文档下的分段命中后可直接返回分段内容,也可让模型优化后返回答案。 - - 【知识库】新增文档迁移知识库功能。 - - 【知识库】上传word文档、添加/编辑分段内容时支持上传本地图片。 - - 【应用】当用户提问题时,若无引用知识库内容,可指定回复内容。 - - 【应用】新增用户问答页面显示知识来源设置。 - - 【应用】支持自定义应用的 logo,用户端浏览器标签显示自定义 logo和应用名称。 - -!!! Abstract "功能优化 :sunflower:" - - 【应用】创建/编辑应用时支持不选择模型。 - - 【问答页面】 AI 回答时优化流式输出,加快数据展示。 - - 【搜索框】搜索框可以支持一键清除搜索条件。 - - 【模型管理】添加模型表单优化提示语。 - -!!! Abstract "问题修复 :palm_tree:" - - 【应用】修复对话日志详情不按时间排序的问题。 - - 【应用】修复问答页面提问达到最大限制的时候返回内容重复。 - - 【应用】修复离线环境提问后由于获取不到 tokens 数导致回答有报错内容的问题。 - - 【应用】修复修改应用信息保存时会导致问答页面进入 404 的问题。 - - 【模型管理】API Key 字符长度过长时,添加模型报错。 - - 【问答页面】问题过长时,AI 回答后会有报错信息。 - -### v1.0.4 - -2024 年 04 月 19 日 - -!!! Abstract "新增功能 :star2:" - - 【模型管理】支持对接智谱 AI 开发放平台的通用大模型。 - - 【模型管理】支持对接讯飞星火大模型。 - - -!!! Abstract "功能优化 :sunflower:" - - 【登录】当前用户使用默认密码登录后需要先修改密码。 - - 【应用】对话日志详情修正答案保存分段时,知识库和文档支持搜索。 - - -### v1.0.3 - -2024 年 04 月 18 日 - -!!! Abstract "新增功能 :star2:" - - 【知识库】上传文档支持选择文件夹。 - - 【模型管理】兼容对接OpenAI 格式的模型。 - - 【模型管理】支持对接通义千问的大模型。 - - 【模型管理】支持对接Kimi大模型。 - -!!! Abstract "功能优化 :sunflower:" - - 【问答页面】优化AI 输出答案的效率。 - - 【命中测试】优化未命中分段时的提示内容。 - -### v1.0.2 - -2024 年 04 月 17 日 - - -!!! Abstract "功能优化 :sunflower:" - - 【知识库】在分段中添加关联问题时,当问题比较长时下拉组件显示不美观。 - -!!! Abstract "问题修复 :palm_tree:" - - 【知识库】修复文本文件中存在空字符(\0)时,上传文档报错。 - - 【知识库】在问题中关联分段,当文档为空时搜索分段标题会。 - - 【应用】修复问答页面用户提问时,只输入空格提问后回答错位的问题。 - - 【应用】问答页面在回答中...时,点击停止回答不生效。 - -### v1.0.1 - -2024 年 04 月 15 日 - -!!! Abstract "功能优化 :sunflower:" - - 【知识库】文档列表、分段标题、分段内容、问题列表查询时大小写不敏感。 - -!!! Abstract "问题修复 :palm_tree:" - - 【知识库】修复整体同步知识库报错。 - - 【知识库】修复添加分段时关联问题报错。 - - 【知识库】文档列表为空时,在问题列表点击关联分段会404。 - - 【应用】修复在应用的命中测试点击分段内容报没有权限访问的问题。 - - -### v1.0.0 - -2024 年 04 月 11 日 - - -!!! Abstract "新增功能 :star2:" - - 【知识库】支持上传 DOCX、PDF 格式的文档。 - - 【知识库】新增问题库,支持把用户的问题梳理到问题库,关联文档中的分段,从而能更精确的匹配到相关知识点。 - - 【应用】新增用量统计功能,针对每个应用支持统计提问用户数据、新增提问用户数、提问数、 消费Tokens数和用户满意度。 - - 【应用】对话日志支持导出。 - - 【模型管理】支持对接 OpenAI 模型。 - -!!! Abstract "功能优化 :sunflower:" - - 【应用】概览中重新生成公开访问链接会导致嵌入第三方脚本失效,增加确认提示。 - - 【应用】浮窗模式嵌入第三方的入口 logo 更新。 - - 【知识库】文档分段详情页面点击返回时,保留分页信息。 - - 【知识库】上传的文档限制调整为 100 MB。 - -!!! Abstract "问题修复 :palm_tree:" - - 【知识库】修复获取在线知识库的更新日志内容为乱码的问题。 - - 【知识库】修复创建知识库后,进入设置页面无法修改知识库的问题。 - - 【知识库】修复上传不支持格式的文档报错的问题。 - - 【应用】修复开启问题优化后,优化后的问题返回为空字符串时未处理的问题。 - - 【应用】修复从对话日志详情中添加标注内容报错的问题。 - - 【应用】修复浮窗模式的 放大按钮与关闭按钮未对齐。 - - 【用户管理】修复创建用户时登录密码使用默认密码MaxKB@123.. 提示规则不对。 - -### v0.9.1 - -2024 年 03 月 27 日 - - -!!! Abstract "新增功能 :star2:" - - 【模型管理】Ollama 供应商添加/修改模型时支持自动下载。 - - 【关于】增加显示项目地址、用户手册、论坛求助入口。 - -!!! Abstract "功能优化 :sunflower:" - - 【模型管理】】Azure OpenAI 的基础模型支持自定义设置,自定义时需要填写 api-version。 - - 【模型管理】】千帆大模型的基础模型支持自定义输入官方标准的大模型(非自行部署)。 - -!!! Abstract "问题修复 :palm_tree:" - - - 【应用】问答提问时同一时间限制只能发出一个快捷问题。 - - 【应用】修复问题优化开启后大模型未返回优化结果时的报错问题。 - - 【知识库】修复上传的 TXT 文档编码格式问题导致内容为空的问题。 - - 【知识库】修复文档列表勾选文档后会自动取消的问题。 - - 【用户管理】修复删除用户报错。 - - 【用户管理】编辑用户禁止修改用户名。 - - 【用户管理】修复禁用用户可以登录。 - - 【用户管理】修改用户姓名超过长度时错误提示不对。 - - 【用户管理】修复无法修改 admin 用户信息的问题。 - - 【用户管理】修复修改用户状态后用户位置变动的问题。 - - -### v0.9.0 - -2024 年 03 月 20 日 - - -!!! Abstract "新增功能 :star2:" - - - **开箱即用**:支持直接上传文档、自动爬取在线文档,支持文本自动拆分、向量化、RAG(检索增强生成),智能问答交互体验好。 - - **无缝嵌入**:支持零编码快速嵌入到第三方业务系统,让已有系统快速拥有智能问答能力,提高用户满意度。 - - **多模型支持**:支持Ollama、百度千帆大模型和 Azure OpenAI 的大语言模型。 diff --git a/docs/contact.md b/docs/contact.md deleted file mode 100644 index c2eb6cfa..00000000 --- a/docs/contact.md +++ /dev/null @@ -1,20 +0,0 @@ -## 1 项目地址 - -!!! Abstract "" - - - [MaxKB](https://github.com/1Panel-dev/MaxKB/issues) ![MaxKB stars](https://img.shields.io/github/stars/1Panel-dev/MaxKB) - -## 2 社区论坛 - -!!! Abstract "" - 大家可以在 [飞致云开源社区论坛 MaxKB 板块](https://bbs.fit2cloud.com/c/mk/11) 搜索、咨询、讨论 MaxKB 以及智能问答系统相关问题,并发表自己的见解与想法。 - -## 3 联系方式 - -!!! Abstract "" - - - 官网:https://maxkb.cn - - 邮箱:support@fit2cloud.com - - 电话:400-052-0755 - - 微信交流群: - ![企业微信](){ width="135px" } diff --git a/docs/dev_manual/APIKey_chat.md b/docs/dev_manual/APIKey_chat.md deleted file mode 100644 index d760d9df..00000000 --- a/docs/dev_manual/APIKey_chat.md +++ /dev/null @@ -1,62 +0,0 @@ -!!! Abstract "" - MaxKB 创建的应用支持通过 OpenAI SDK 格式以及提供系统 SDK接入,专业版在社区版本基础上提供平台级别的完整 SDK,详细情况见:[系统API](../user_manual/X-Pack/system_API.md)。 - -## 1 标准OpenAI API格式 - -!!! Abstract "" - MaxKB 应用兼容 OpenAI API 格式,在OpenAI API 原有调用方式的基础上替换为 MaxKB 应用提供的 Base URL 以及 API Key 即可。 - -![API doc](../img/dev/openai_baseurl.png) - -!!! Abstract "" - - ``` - # 将url 和 Authorization 替换为 MaxKB 应用实际真实的 Base URL 和 API Key。 - - curl https://maxkb.fit2cloud.com/api/application/xxxxxxxx-8c56-11ef-a99e-0242ac140003/chat/completions \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer application-xxxxxxxxf00e21a7530d1177c20967" \ - -d '{ - "model": "gpt-3.5-turbo", - "messages": [ - { - "role": "你是杭州飞致云信息科技有限公司旗下产品 MaxKB 知识库问答系统的智能小助手,你的工作是帮助 MaxKB 用户解答使用中遇到的问题,用户找你回答问题时,你要把主题放在 MaxKB 知识库问答系统身上。", - "content": "MaxKB 是什么?" - } - ] - }' - ``` - -## 2 系统API - -### 2.1 打开API文档 - -!!! Abstract "" - 在应用信息中复制并访问 swagger 地址。 - -![API doc](../img/dev/app_swaagger.png) - -### 2.2 API Key认证 - -![APIKEY](../img/dev/app_apikey.png) - -### 2.3 获取应用信息 - -!!! Abstract "" - 调用 profile 接口,获取应用详细信息(应用 id、name等)。 - -![ profile](../img/dev/app_profile.png) - -### 2.4 打开会话 - -!!! Abstract "" - 调用打开会话接口,输入上述步骤获取的应用 id,打开会话并获取会话 id。 - -![appid](../img/dev/chat_open.png) - -### 2.5 进行对话 - -!!! Abstract "" - 调用对话接口,输入会话 id 进行对话。 - -![chatid](../img/dev/app_chat.png) \ No newline at end of file diff --git a/docs/dev_manual/dev_environment.md b/docs/dev_manual/dev_environment.md deleted file mode 100644 index 636c11dd..00000000 --- a/docs/dev_manual/dev_environment.md +++ /dev/null @@ -1,152 +0,0 @@ -# 开发环境搭建 - -## 1 项目结构 - -!!! Abstract "" - - ``` - . - ├── LICENSE # License 申明 - ├── README.md - ├── apps # 后端项目根目录 - │ ├── application # 应用 - │ ├── common # 项目公共资源目录 - │ ├── dataset # 知识库 - │ ├── embedding # 向量化 - │ ├── function_lib # 函数库 - │ ├── ops # - │ ├── setting # 设置 - │ ├── smartdoc # 项目主目录 - │ ├── users # 用户相关 - │ └── manage.py # django项目入口 - ├── installer # 安装相关 - ├── pyproject.toml # 后端依赖 配置文件 - └── ui # 前端项目根目录 - ├── config_example.yml # 项目配置示例 - ├── main.py # 项目入口文件 - ``` - -## 2 环境准备 - -!!! Abstract "" - - **前端环境准备** - 安装 [node](https://nodejs.org/) ,v16及以上版本 - - **后端环境准备** - 安装 [python](https://www.python.org/downloads/release/python-3115/) ,版本 v3.11.x - 安装 [pycharm](https://www.jetbrains.com/pycharm/download/) - - **数据库** - 安装 [PostgreSql](https://www.postgresql.org/) ,版本 v15.x - -## 3 本地配置 - -### 3.1 创建数据库 - -!!! Abstract "" - 在 PostgreSql 中手动创建MaxKB 应用数据库,名称为`maxkb`。 - ``` - # 创建数据库 - CREATE DATABASE "maxkb"; - # 切换使用数据库 - \c "maxkb"; - # 创建vector 扩展 - CREATE EXTENSION "vector"; - ``` - -### 3.2 配置文件 - -!!! Abstract "" - 项目启动之前,需要准备配置文件及目录 - - - 准备配置文件 - - ```bash - # 将config_example.yml配置文件拷贝至 /opt/maxkb/conf目录下 - cp config_example.yml /opt/maxkb/conf - ``` - - - 配置 /opt/maxkb/conf/config_example.yml - - ``` - # 数据库配置(将以下信息替换为实际环境信息) - DB_NAME: maxkb - DB_HOST: localhost - DB_PORT: 5432 - DB_USER: root - DB_PASSWORD: xxx - DB_ENGINE: django.db.backends.postgresql_psycopg2 - - # 模型相关配置 - # 模型路径:如果EMBEDDING_MODEL_NAME是绝对路径则无效,反之则会从https://huggingface.co/下载模型到当前目录 - EMBEDDING_MODEL_PATH: /opt/maxkb/model/ - # 模型名称:如果模型名称是路径,则会加载目录下的模型,如果是模型名称,则会在https://huggingface.co/下载模型 模型的下载位置为EMBEDDING_MODEL_PATH - EMBEDDING_MODEL_NAME: /opt/maxkb/model/shibing624_text2vec-base-chinese - ``` - -## 4 开发调试 - -### 4.1 启动前端 - -!!! Abstract "" - - ```bash - # 在 `ui`目录 执行安装前端需要的依赖 - npm install - - # 然后启动项目 - npm run dev - ``` - - 启动成功后,如下图显示。 - -![启动前端](../img/dev/npm_run.png){width="500px"} - - -### 4.2 启动后端 - -!!! Abstract "" - 后端系统,需要启动 web服务、本地模型服务、和异步任务队列服务。 - 注意: 在项目根目录执行 - -!!! Abstract "" - 在 MaxKB 项目根目录下依次执行以下命令,启动 Web 服务。 - - ``` - # 安装 poetry 包管理器 - pip install poetry - - # 安装后端需要的依赖 - poetry install - * 注意:如果在国内安装,需要配置 poetry 的源,否则下载非常慢,经常无法正常安装,配置命令为:`poetry source add --priority=primary mirrors http://mirrors.aliyun.com/pypi/simple` - - # 启动项目 - python main.py start - ``` - -![启动Web服务](../img/dev/main_start.png){width="500px"} - -!!! Abstract "" - 在 MaxKB 项目根目录下依次执行以下命令,启动本地模型服务。 - - ``` - # 启动项目 - python main.py dev local_model - ``` - -![启动本地模型服务](../img/dev/main_localmodel.png){width="500px"} - -!!! Abstract "" - 在 MaxKB 项目根目录下依次执行以下命令,启动异步任务服务。 - - ``` - # 启动项目 - python main.py dev celery - ``` - -![启动异步任务服务](../img/dev/main_celery.png){width="500px"} - -## 5 访问项目 - -!!! Abstract "" - 前后端都启动成功后,就可以通过前端路由(前端启动出现的访问地址)在浏览器中进行访问。 - -![浏览器访问](../img/dev/maxkb_running.png) diff --git a/docs/faq/GPU_runOllama.md b/docs/faq/GPU_runOllama.md deleted file mode 100644 index a40cb1fa..00000000 --- a/docs/faq/GPU_runOllama.md +++ /dev/null @@ -1,48 +0,0 @@ -# 如何让Ollama使用GPU运行LLM模型 - -!!! Abstract "" - 以 NVIDIA 为例,说明 Ollama GPU 模式运行大模型的具体操作。 - - -## 1 安装英伟达容器安装包 - -!!! Abstract "" - 以 Ubuntu 22.04 为例(其它系统请参考:[英伟达官方文档](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/arch-overview.html)) - - - 配置 apt 源 - ``` - curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \ - && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \ - sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ - sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list - ``` - - 更新源 - ``` - sudo apt-get update - ``` - - 安装工具包 - ``` - sudo apt-get install -y nvidia-container-toolkit - ``` - -## 2 使用 GPU 运行 Ollama - -!!! Abstract "" - ``` - # 以后台模式运行 ollama 容器,并允许容器访问主机上所有可用的 NVIDIA GPU - docker run --gpus all -d -v /opt/ai/ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama - ``` - -## 3 使用 Ollama 下载模型 - -!!! Abstract "" - ``` - # 在线下载并运行模型 - docker exec -it ollama ollama run qwen:7b - ``` - -## 4 在 MaxKB 中添加 Ollama 模型 - -!!! Abstract "" - 下载完成并运行模型服务后,即可在 MaxKB 中添加对应的模型并使用。 -![添加模型](../img/FAQ/addmodel.png) \ No newline at end of file diff --git a/docs/faq/MaxKB VS.Dify.md b/docs/faq/MaxKB VS.Dify.md deleted file mode 100644 index 9f03ddfa..00000000 --- a/docs/faq/MaxKB VS.Dify.md +++ /dev/null @@ -1,81 +0,0 @@ -!!! Abstract "" - - MaxKB 和 Dify 都是基于大语言模型技术的开源项目,两者在产品定位以及能力上存在差异: - - - 产品定位不同:Dify 定位于大模型应用的开发平台,属于中间件范畴;MaxKB 定位于基于大模型和 RAG 的智能问答助手,属于开箱即用的最终应用。 - - 产品能力对比:以下表格是 Dify 官方提供的与 LangChain、Flowise 等产品的能力对比;MaxKB 是基于LangChain构建的应用,并补齐了 LangChain 在 Workflow 和 SSO 等企业级功能上面的空白。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
功能Dify.AILangChainFlowiseOpenAI Assistant APIMaxKB(Built on LangChain)
编程方法API + 应用程序导向Python 代码应用程序导向API 导向API + 应用程序导向
支持的 LLMs丰富多样丰富多样丰富多样仅限 OpenAI丰富多样
RAG引擎
Agent
工作流
可观测性
企业功能(SSO/访问控制)
本地部署
\ No newline at end of file diff --git a/docs/faq/Offline_install_OllamaModel.md b/docs/faq/Offline_install_OllamaModel.md deleted file mode 100644 index 4ac838b6..00000000 --- a/docs/faq/Offline_install_OllamaModel.md +++ /dev/null @@ -1,58 +0,0 @@ -# 如何使用Ollama离线部署LLM大语言模型 - - -!!! Abstract "" - 以 qwen:0.5b 模型为例,详细说明 Ollama 离线部署 LLM 大语言模型的过程和步骤。 - -## 1 下载模型 - -!!! Abstract "" - 访问 huggingface 并下载 qwen1_5-0_5b-chat-q5_k_m.gguf 模型文件。 - ``` - https://huggingface.co/Qwen/Qwen1.5-0.5B-Chat-GGUF/tree/main - ``` -![下载模型](../img/FAQ/downModel.png) - -## 2 上传模型 - -!!! Abstract "" - 将下载好的 Qwen1.5-0.5B-Chat-GGUF 模型文件上传到 Ollama 所在服务器。 - -## 3 创建Ollama Modelfile - -!!! Abstract "" - 创建一个名为 Modelfile 的文件,内容如下: - ``` - FROM ./qwen1_5-0_5b-chat-q5_k_m.gguf - - TEMPLATE """{{ if .System }}<|im_start|>system - {{ .System }}<|im_end|>{{ end }}<|im_start|>user - {{ .Prompt }}<|im_end|> - <|im_start|>assistant - """ - - PARAMETER stop "<|im_start|>" - PARAMETER stop "<|im_end|>" - ``` - 说明:不同模型的 Modelfile 内容不同,可参考 Ollama 官网 [参数设置](https://ollama.com/library/qwen:0.5b) 。 - -![模型参数模版](../img/FAQ/modelSetting.png) - - -## 4 在 Ollama 中创建模型 - -!!! Abstract "" - 执行以下命令,创建模型: - ``` - ollama create qwen:0.5b -f Modelfile - ``` - 执行以下命令,确认模型创建成功: - ``` - ollama list - ``` - -![ollama查看模型列表](../img/FAQ/ollamaList.png) - -## 5 在 MaxKB 中添加已创建的私有模型 - -![MaxKB中添加模型](../img/FAQ/MaxKBaddModel.png) \ No newline at end of file diff --git a/docs/faq/maxkb_In_halo.md b/docs/faq/maxkb_In_halo.md deleted file mode 100644 index 7526b65b..00000000 --- a/docs/faq/maxkb_In_halo.md +++ /dev/null @@ -1,7 +0,0 @@ -# 将 MaxKB 小助手集成到 Halo 中 - -!!! Abstract "" - [Halo](https://github.com/halo-dev/halo) [ˈheɪloʊ],强大易用的开源建站工具。通过 MaxKB 小助手插件,可以将文章内容同步至 MaxKB 知识库,并可通过浮窗模式为网站提供智能问答。 - 有关 MaxKB 小助手插件的使用说明,请查看 [官方文档](https://www.halo.run/store/apps/app-aWHcE)。 - -![halo](../img/FAQ/halo.png) \ No newline at end of file diff --git a/docs/img/app/dingding_setting.png b/docs/img/app/dingding_setting.png deleted file mode 100644 index 0b060cdb..00000000 Binary files a/docs/img/app/dingding_setting.png and /dev/null differ diff --git a/docs/img/app/embed.png b/docs/img/app/embed.png deleted file mode 100644 index 8482cd6d..00000000 Binary files a/docs/img/app/embed.png and /dev/null differ diff --git a/docs/img/app/ent_wechat_setting.png b/docs/img/app/ent_wechat_setting.png deleted file mode 100644 index b57cfb26..00000000 Binary files a/docs/img/app/ent_wechat_setting.png and /dev/null differ diff --git a/docs/img/app/feishu_setting.png b/docs/img/app/feishu_setting.png deleted file mode 100644 index cb0d0169..00000000 Binary files a/docs/img/app/feishu_setting.png and /dev/null differ diff --git a/docs/img/app/maxkb_feishu_config.png b/docs/img/app/maxkb_feishu_config.png deleted file mode 100644 index 5f14ae07..00000000 Binary files a/docs/img/app/maxkb_feishu_config.png and /dev/null differ diff --git a/docs/img/app/public_account_setting_empty.png b/docs/img/app/public_account_setting_empty.png deleted file mode 100644 index f594427a..00000000 Binary files a/docs/img/app/public_account_setting_empty.png and /dev/null differ diff --git a/docs/img/app/view_setting.png b/docs/img/app/view_setting.png deleted file mode 100644 index 5f5d3c29..00000000 Binary files a/docs/img/app/view_setting.png and /dev/null differ diff --git a/docs/img/fx/add_fx.png b/docs/img/fx/add_fx.png deleted file mode 100644 index 74ce6bd6..00000000 Binary files a/docs/img/fx/add_fx.png and /dev/null differ diff --git a/docs/img/system/CAS.png b/docs/img/system/CAS.png deleted file mode 100644 index 7f4ba344..00000000 Binary files a/docs/img/system/CAS.png and /dev/null differ diff --git a/docs/img/system/LDAP.png b/docs/img/system/LDAP.png deleted file mode 100644 index 23b2542e..00000000 Binary files a/docs/img/system/LDAP.png and /dev/null differ diff --git a/docs/img/system/OIDC.png b/docs/img/system/OIDC.png deleted file mode 100644 index 508cc03e..00000000 Binary files a/docs/img/system/OIDC.png and /dev/null differ diff --git a/docs/img/system/apikey.png b/docs/img/system/apikey.png deleted file mode 100644 index f15a61cc..00000000 Binary files a/docs/img/system/apikey.png and /dev/null differ diff --git a/docs/img/system/dingding_app_create.png b/docs/img/system/dingding_app_create.png deleted file mode 100644 index c9fdee81..00000000 Binary files a/docs/img/system/dingding_app_create.png and /dev/null differ diff --git a/docs/img/system/dingding_app_info.png b/docs/img/system/dingding_app_info.png deleted file mode 100644 index 64ce22db..00000000 Binary files a/docs/img/system/dingding_app_info.png and /dev/null differ diff --git a/docs/img/system/dingding_app_release.png b/docs/img/system/dingding_app_release.png deleted file mode 100644 index 85aa1474..00000000 Binary files a/docs/img/system/dingding_app_release.png and /dev/null differ diff --git a/docs/img/system/dingding_setting.png b/docs/img/system/dingding_setting.png deleted file mode 100644 index 1574d6f2..00000000 Binary files a/docs/img/system/dingding_setting.png and /dev/null differ diff --git a/docs/img/system/feishu_app_release.png b/docs/img/system/feishu_app_release.png deleted file mode 100644 index 2498bf2f..00000000 Binary files a/docs/img/system/feishu_app_release.png and /dev/null differ diff --git a/docs/img/system/feishu_create_app.png b/docs/img/system/feishu_create_app.png deleted file mode 100644 index 2ff01b42..00000000 Binary files a/docs/img/system/feishu_create_app.png and /dev/null differ diff --git a/docs/img/system/feishu_setting.png b/docs/img/system/feishu_setting.png deleted file mode 100644 index 25a430e8..00000000 Binary files a/docs/img/system/feishu_setting.png and /dev/null differ diff --git a/docs/img/system/feishu_url.png b/docs/img/system/feishu_url.png deleted file mode 100644 index e8b9bf1c..00000000 Binary files a/docs/img/system/feishu_url.png and /dev/null differ diff --git a/docs/img/system/oauth2.png b/docs/img/system/oauth2.png deleted file mode 100644 index 6c8cf6c7..00000000 Binary files a/docs/img/system/oauth2.png and /dev/null differ diff --git a/docs/img/system/qiwei_appinfo.png b/docs/img/system/qiwei_appinfo.png deleted file mode 100644 index 34d3f23f..00000000 Binary files a/docs/img/system/qiwei_appinfo.png and /dev/null differ diff --git a/docs/img/system/qiwei_callback.png b/docs/img/system/qiwei_callback.png deleted file mode 100644 index f7ca8342..00000000 Binary files a/docs/img/system/qiwei_callback.png and /dev/null differ diff --git a/docs/img/system/qiwei_create_app.png b/docs/img/system/qiwei_create_app.png deleted file mode 100644 index 2294ad9e..00000000 Binary files a/docs/img/system/qiwei_create_app.png and /dev/null differ diff --git a/docs/img/system/qiwei_ip.png b/docs/img/system/qiwei_ip.png deleted file mode 100644 index 15b36826..00000000 Binary files a/docs/img/system/qiwei_ip.png and /dev/null differ diff --git a/docs/img/system/qiwei_setting.png b/docs/img/system/qiwei_setting.png deleted file mode 100644 index b947e7be..00000000 Binary files a/docs/img/system/qiwei_setting.png and /dev/null differ diff --git a/docs/img/system/qiwei_yuming.png b/docs/img/system/qiwei_yuming.png deleted file mode 100644 index ba9a9e7c..00000000 Binary files a/docs/img/system/qiwei_yuming.png and /dev/null differ diff --git a/docs/img/system/swagger_api.png b/docs/img/system/swagger_api.png deleted file mode 100644 index f808cf2d..00000000 Binary files a/docs/img/system/swagger_api.png and /dev/null differ diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index 7f41a92a..00000000 --- a/docs/index.md +++ /dev/null @@ -1,65 +0,0 @@ -# 产品介绍 - -## 1 产品介绍 - -!!! Abstract "" - - 生成式 AI(Artificial Intelligence Generated Content,AIGC)的兴起标志着信息技术行业进入了崭新的发展阶段,为社会进步和经济发展打开了巨大的想象空间。检索增强生成(Retrieval Augmented Generation,RAG)技术通过整合内部知识库的丰富信息赋能大语言模型(Large Language Model,简称 LLM),为生成式 AI 带来了革命性的改进。在生成答案或内容时,RAG 技术能够参照精确的知识源,为用户提供高度合理和准确的响应。 - -!!! Abstract "" - - RAG 技术与 LLM 模型相结合的应用方式,成功弥补了 LLM 模型在处理特定领域请求时存在幻觉、知识泛化、可解释性差等问题。基于 LLM 和 RAG 技术的知识库应用,可以帮助企业提升知识管理与服务水平,提高工作效率,实现业务的提质增效。 - -!!! Abstract "" - - MaxKB = Max Knowledge Base,是一款基于大语言模型和 RAG 的开源知识库问答系统,广泛应用于智能客服、企业内部知识库、学术研究与教育等场景。作为一款专注于知识库问答场景的软件产品,MaxKB 能够为企业的智能化进程注入新的动力,助力企业实现“提质增效”的目标。在知识库管理方面,MaxKB 帮助企业实现知识采集、知识入库、知识库构建的全流程自动化;在场景化智能搜索方面,MaxKB 能够解析用户输入的问题并匹配检索知识库;在回复准确性方面,MaxKB 采用了成熟的 LLM + RAG 技术,能够最大限度地降低大模型幻觉对知识搜索准确性的干扰,提高企业对业务数据的分类与召回能力;安全性方面,MaxKB 支持本地部署和调用本地大模型,有效管控企业使用知识库时越级访问的风险,以及公有模型在数据传输方面可能存在的安全隐患。借助 MaxKB,企业用户可以快速上线业务 AI 助手,将生成式 AI 能力应用于业务数据管理、内部资料查询、线上客户服务等领域,优化业务服务流程并切实提升用户体验。 - -![概览](img/index/UI.jpg) - -## 2 产品优势 - -!!! Abstract "" - - - **开箱即用** - 支持直接上传文档 / 自动爬取在线文档,支持文本自动拆分、向量化和 RAG(检索增强生成),有效减少大模型幻觉,智能问答交互体验好; - - - **快速接入** - 支持零编码嵌入到第三方业务系统,以及快速接入企业微信、钉钉、飞书、公众号等应用,让已有系统快速拥有智能问答能力,提高用户满意度; - - - **灵活编排** - 内置强大的工作流引擎和函数库,支持编排 AI 工作过程,满足复杂业务场景下的需求; - - - **模型中立** - 支持对接各种大模型,包括本地私有大模型(Llama 3 / Qwen 2 等)、国内公共大模型(DeepSeek / SILICONFLOW / 通义千问 / 腾讯混元 / 字节豆包 / 百度千帆 / 智谱 AI / Kimi 等)和国外公共大模型(OpenAI / Azure OpenAI / Anthropic / Gemini 等)。 - -## 3 案例展示 - -!!! Abstract "" - - MaxKB 自发布以来,日均安装下载超过 1000 次,被广泛应用于智能客服、企业内部知识库、学术研究与教育等场景,典型应用案例详情见如下链接: - - - [MaxKB 应用案例:中国农业大学-小鹉哥](https://mp.weixin.qq.com/s/4g_gySMBQZCJ9OZ-yBkmvw) - - [MaxKB 应用案例:东北财经大学-小银杏](https://mp.weixin.qq.com/s/3BoxkY7EMomMmmvFYxvDIA) - - [MaxKB 应用案例:中铁水务](https://mp.weixin.qq.com/s/voNAddbK2CJOrJJs1ewZ8g) - - [MaxKB 应用案例:解放军总医院](https://mp.weixin.qq.com/s/ETrZC-vrA4Aap0eF-15EeQ) - - [MaxKB 应用案例:无锡市数据局](https://mp.weixin.qq.com/s/enfUFLevvL_La74PQ0kIXw) - - [MaxKB 应用案例:中核西仪研究院-西仪睿答](https://mp.weixin.qq.com/s/CbKr4mev8qahKLAtV6Dxdg) - - [MaxKB 应用案例:南京中医药大学](https://mp.weixin.qq.com/s/WUmAKYbZjp3272HIecpRFA) - - [MaxKB 应用案例:西北电力设计院-AI数字助理Memex](https://mp.weixin.qq.com/s/ezHFdB7C7AVL9MTtDwYGSA) - - [MaxKB 应用案例:西安国际医院中心医院-国医小助](https://mp.weixin.qq.com/s/DSOUvwrQrxbqQxKBilTCFQ) - - [MaxKB 应用案例:华莱士智能AI客服助手上线啦!](https://www.bilibili.com/video/BV1hQtVeXEBL) - - [MaxKB 应用案例:把医疗行业知识转化为知识库问答助手!](https://www.bilibili.com/video/BV157wme9EgB) - - [MaxKB 应用案例:会展AI智能客服体验](https://www.bilibili.com/video/BV1J7BqY6EKA) - - [MaxKB 应用案例:孩子要上幼儿园了,AI 智能助手择校好帮手](https://www.bilibili.com/video/BV1wKrhYvEer) - - [MaxKB 应用案例:产品使用指南AI助手,新手小白也能轻松搞定!](https://www.bilibili.com/video/BV1Yz6gYtEqX) - - [MaxKB 应用案例:生物医药AI客服智能体验!](https://www.bilibili.com/video/BV13JzvYsE3e) - - [MaxKB 应用案例:高校行政管理AI小助手](https://www.bilibili.com/video/BV1yvBMYvEdy) - -## 4 了解更多 - -!!! Abstract "" - - - [如何向团队介绍 MaxKB](https://fit2cloud.com/maxkb/download/introduce-maxkb_202502.pdf) - - [飞致云培训认证中心](https://edu.fit2cloud.com/index) - - [MaxKB 小课堂](https://space.bilibili.com/510493147/lists/3590204?type=season) - - [MaxKB 知识库](https://kb.fit2cloud.com/categories/maxkb) diff --git a/docs/installation/1panel_installtion.md b/docs/installation/1panel_installtion.md deleted file mode 100644 index 2ab7da91..00000000 --- a/docs/installation/1panel_installtion.md +++ /dev/null @@ -1,50 +0,0 @@ -## 1 安装 1Panel - -!!! Abstract "" - - 关于 1Panel 的安装部署与基础功能介绍,请参考 [1Panel 官方文档](https://1panel.cn/docs/) 。在完成了 1Panel 的安装部署后,根据提示网址打开浏览器进入 1Panel,界面如下。 - -![1panel](../img/index/1panel.jpg) - -## 2 安装 MaxKB - -!!! Abstract "" - 进入应用商店应用列表,在【AI/大模型】分类下找到 MaxKB 应用进行安装。 - -![1panel-maxkb](../img/index/1panel_maxkb.jpg) - -!!! Abstract "" - - 在安装页面配置 MaxKB 应用参数: - - - 名称:要创建的 MaxKB 应用的名称。 - - 版本:选择 MaxKB 的版本。 - - 端口:MaxKB 应用的服务端口。 - - 容器名称:MaxKB 应用容器名称。 - - CPU 限制:MaxKB 应用可以使用的 CPU 核心数。 - - 内存限制:MaxKB 应用可以使用的内存大小。 - - 端口外部访问:MaxKB 应用可以使用 IP:PORT 进行访问(MaxKB 应用必须勾选外部端口访问)。 - -![maxkb-setting](../img/index/maxkb_setting.jpg) - -!!! Abstract "" - - 点击确认开始安装,页面自将动跳转到已安装应用列表,等待 MaxKB 应用状态变为已启动。 - -![maxkb启动](../img/index/maxkb-start.jpg) - -## 3 访问 MaxKB - -!!! Abstract "" - - 安装成功后,通过浏览器访问如下页面登录 MaxKB: - - ``` - 地址: http://目标服务器IP地址:服务运行端口(默认 8080) - 用户名: admin - 密码: MaxKB@123.. - ``` - - 为了安全,admin 第一次登录时将要求修改默认密码,修改密码后,重新登录系统即可使用 MaxKB。 - -![登录成功](../img/index/UI.jpg) diff --git a/docs/installation/aliyun.md b/docs/installation/aliyun.md deleted file mode 100644 index 01f52c09..00000000 --- a/docs/installation/aliyun.md +++ /dev/null @@ -1,44 +0,0 @@ -# 云市场部署指南 - -!!! Abstract "" - - 本指南将介绍如何通过阿里云云市场购买、部署和使用 **MaxKB** 镜像,并提供购买服务器的优惠链接。 - -## 1 购买镜像 - -!!! Abstract "" - - - MaxKB 已经上架到阿里云云市场,您可以通过以下链接直接购买镜像: - [MaxKB 云市场购买链接](https://market.aliyun.com/products/53690006/cmjj00067609.html?userCode=kmemb8jp) - - - 您也可以自行购买阿里云服务器,并在选择镜像时搜索 **MaxKB**,即可快速选择镜像进行部署。 - - **注意:** 购买时请选择合适的实例规格,建议 4C/8G 及以上。 - -!!! Abstract "服务器优惠" - - 如果您还没有服务器,可以通过以下优惠链接购买阿里云服务器: - - - [专属阿里云特价链接 5.5 折优惠](https://market.aliyun.com/common/dashi/maxkb?userCode=kmemb8jp) - -## 2 启动服务 - -!!! Abstract "" - - 镜像启动后,您可以通过浏览器访问以下地址登录 MaxKB: - - ``` - 服务访问地址: http://服务器IP:8080 - 默认用户名: admin - 默认密码: MaxKB@123.. - ``` - - 首次登录后,建议及时更改密码并进行其他安全设置。 - -## 3 开放端口 - -!!! Abstract "" - - - 为了确保外部能够正常访问 MaxKB 服务,您需要在阿里云服务器的安全组规则中开放 `8080` 端口。 - - - 具体的开放步骤可以参考阿里云的 [端口放行教程](https://help.aliyun.com/document_detail/25471.html)。 diff --git a/docs/installation/cli.md b/docs/installation/cli.md deleted file mode 100644 index 9cb5f080..00000000 --- a/docs/installation/cli.md +++ /dev/null @@ -1,26 +0,0 @@ -## 1 mkctl 命令 - -!!! Abstract "" - MaxKB 离线安装包默认内置了命令行运维工具 mkctl,通过执行 `mkctl help`,可以查看相关的命令说明。 - - **说明**: - - - 1.5.0 之前版本请使用 kbctl 命令。 - - 通过在线安装、1Panel方式安装,并没有内置 mkctl 命令。 - - ``` - Usage: - mkctl [COMMAND] [ARGS...] - mkctl --help - - Commands: - status 查看 MaxKB 服务运行状态 - start 启动 MaxKB 服务 - stop 停止 MaxKB 服务 - restart 重启 MaxKB 服务 - reload 重新加载 MaxKB 服务 - uninstall 卸载 MaxKB 服务 - upgrade 升级 MaxKB 服务 - version 查看 MaxKB 版本信息 - clean-images 清理 MaxKB 旧版本的相关镜像 - ``` diff --git a/docs/installation/offline_installtion.md b/docs/installation/offline_installtion.md deleted file mode 100644 index 06e103c2..00000000 --- a/docs/installation/offline_installtion.md +++ /dev/null @@ -1,119 +0,0 @@ -## 1 部署要求 - -!!! Abstract "" - 如果用于生产环境,离线安装是官方推荐的安装方式。 - -### 1.1 服务器配置 - -!!! Abstract "" - - **部署服务器要求:** - - * 操作系统:Ubuntu 22.04 / CentOS 7.6 64 位系统 - * CPU/内存:4C/8GB 以上 - * 磁盘空间:100GB - -### 1.2 端口要求 - -!!! Abstract "" - 离线部署 MaxKB 需要开通的访问端口说明如下: - -| 端口 | 作用 | 说明 | -|--------|:---------|:--------------------------| -| 22 | SSH | 安装、升级及管理使用 | -| 8080 | Web 服务端口 | 默认 Web 服务访问端口,可根据实际情况进行更改 | - - - -## 2 安装包下载 - -!!! Abstract "" - 打开 [飞致云开源社区 MaxKB 社区版下载](https://community.fit2cloud.com/#/products/maxkb/downloads) 页面下载最新版本安装包,并上传至部署服务器(以 v1.2.0 为例说明安装部署过程)。 - -## 3 安装部署 - -### 3.1 解压安装包 - -!!! Abstract "" - - 以 root 用户通过 ssh 协议登录到部署服务器, 对安装包进行解压: - ``` - tar -zxvf maxkb-v1.2.0-offline.tar.gz - ``` - -### 3.2 安装配置(可选) - -!!! Abstract "" - - MaxKB 安装目录、服务运行端口、数据库配置等信息可在安装包解压后中的 install.conf 文件进行配置。 - - ``` - ## 安装目录 - MAXKB_BASE=/opt - ## Service 端口 - MAXKB_PORT=8080 - ## docker 网段设置 - MAXKB_DOCKER_SUBNET=172.19.0.0/16 - # 数据库配置 - ## 是否使用外部数据库 - MAXKB_EXTERNAL_PGSQL=false - ## 数据库地址 - MAXKB_PGSQL_HOST=pgsql - ## 数据库端口 - MAXKB_PGSQL_PORT=5432 - ## 数据库库名 - MAXKB_PGSQL_DB=maxkb - ## 数据库用户名 - MAXKB_PGSQL_USER=root - ## 数据库密码 - MAXKB_PGSQL_PASSWORD=Password123@postgres - ``` - - **注意**:首次安装之前可在 install.conf文件中的修改参数,安装时则根据修改后的参数执行安装。完成安装后如需再次修改配置参数,则需要在 ${MAXKB_BASE}/maxkb/.env(默认是 /opt/maxkb/.env)文件中进行修改,并且在修改完后需执行 `mkctl reload` 命令重新加载配置文件。 - - -### 3.3 执行安装脚本 - -!!! Abstract "" - - ``` - # 进入安装包解压缩后目录 - cd maxkb-v1.2.0-offline - - # 执行安装命令 - bash install.sh - ``` - -![安装](../img/index/install.jpg) - -## 4 登录访问 - -!!! Abstract "" - - 待所有容器状态显示为`healthy`后,即可通过浏览器访问地址 `http://目标服务器 IP 地址:8080`,并使用默认的管理员用户和密码登录 MaxKB。 - - ``` - 用户名:admin - 默认密码:MaxKB@123.. - ``` - -![登录](../img/index/login.jpg) - -## 5 离线升级 - -!!! Abstract "" - - 离线升级与安装操作过程基本一样,即下载新版本安装包上传解压后,再次执行安装命令进行升级。 - - ``` - # 进入新版本目录 - cd maxkb-v1.x.y-offline - - # 运行安装脚本 - bash install.sh - - # 查看 MaxKB 运行状态 - mkctl status - ``` - - **注意:** 升级前请先对数据库进行备份。 diff --git a/docs/installation/online_installtion.md b/docs/installation/online_installtion.md deleted file mode 100644 index cfc32716..00000000 --- a/docs/installation/online_installtion.md +++ /dev/null @@ -1,78 +0,0 @@ -## 1 部署要求 - -### 1.1 服务器配置 - -!!! Abstract "" - - **部署服务器要求:** - - * 操作系统:Ubuntu 22.04 / CentOS 7.6 64 位系统 - * CPU/内存:4C/8GB 以上 - * 磁盘空间:100GB - -### 1.2 端口要求 - -!!! Abstract "" - - 在线部署 MaxKB 需要开通的访问端口说明如下: - -| 端口 | 作用 | 说明 | -|--------|:---------|:--------------------------| -| 22 | SSH | 安装、升级及管理使用 | -| 8080 | Web 服务端口 | 默认 Web 服务访问端口,可根据实际情况进行更改 | - - -## 2 在线快速部署 - -!!! Abstract "" - - MaxKB 支持一键启动,仅需执行以下命令: - ``` - # Linux 操作系统 - docker run -d --name=maxkb --restart=always -p 8080:8080 -v ~/.maxkb:/var/lib/postgresql/data -v ~/.python-packages:/opt/maxkb/app/sandbox/python-packages registry.fit2cloud.com/maxkb/maxkb - - # Windows 操作系统 - docker run -d --name=maxkb --restart=always -p 8080:8080 -v C:/maxkb:/var/lib/postgresql/data -v C:/python-packages:/opt/maxkb/app/sandbox/python-packages registry.fit2cloud.com/maxkb/maxkb - ``` - - 待所有容器状态显示为`healthy`后,可通过浏览器访问 MaxKB: - ``` - http://目标服务器 IP 地址:8080 - - 默认登录信息 - 用户名:admin - 默认密码:MaxKB@123.. - ``` - -## 3 在线升级 - -!!! Abstract "" - - 根据以下步骤依次执行进行升级: - - (1) 下载最新镜像 - ``` - docker pull registry.fit2cloud.com/maxkb/maxkb - ``` - (2)查看并确认上一次数据持久化目录,复制保存 - ``` - docker inspect maxkb - ``` - -![获取pgsql目录](../img/index/mount_pgsqldir2.png) - -!!! Abstract "" - - (3)删除正在运行的、旧版本的 MaxKB 容器 - - ``` - docker rm -f maxkb - ``` - - (4)启动并运行新版本的 MaxKB 容器 - - **注意:** 务必确认数据持久化目录(即命令行中 -v后的目录)要跟第 (2) 步查看目录保持一致,否则启动后整个系统的数据为空。 - - ``` - docker run -d --name=maxkb --restart=always -p 8080:8080 -v ~/.maxkb:/var/lib/postgresql/data -v ~/.python-packages:/opt/maxkb/app/sandbox/python-packages registry.fit2cloud.com/maxkb/maxkb - ``` diff --git a/docs/installation/tencent.md b/docs/installation/tencent.md deleted file mode 100644 index 67b9d644..00000000 --- a/docs/installation/tencent.md +++ /dev/null @@ -1,36 +0,0 @@ -# 云应用部署指南 - -!!! Abstract "" - - 本指南将介绍如何通过腾讯云中快速安装 **MaxKB** 云应用。 - -## 1 安装应用 - -!!! Abstract "" - MaxKB 社区版已上架腾讯云云应用,可直接在腾讯云服务器中快速部署。 - - 第一步:关联我们的腾讯云合作伙伴账户,享受更多优惠福利:[点击链接进行关联](https://partner.cloud.tencent.com/invitation/10002820907763620ace838b1?inviteType=2 - - 第二步:直接打开 [MaxKB 云应用](https://app.cloud.tencent.com/detail/SPU_BHDJDDBHBE5864) 。 - -![腾讯云应用](../img/index/maxkb_app_cloud.png) - -!!! Abstract "" - - 第三步:选择合适云资源配置。点击【安装应用】后,设置云资源设置,建议至少 4c8g 及以上规格。 - -![应用资源](../img/index/app_resource.png) -![应用资源](../img/index/app_resource2.png) - - - -!!! Abstract "" - - 第四步:安装和启动。点击【安装应用】,等待后台安装以及服务启动。启动完成后,点击【打开应用】,即可使用默认的管理员用户和密码登录 MaxKB。 - - ``` - 用户名:admin - 默认密码:MaxKB@123.. - ``` -![安装](../img/index/open_maxkb_app.png) - diff --git a/docs/quick_start.md b/docs/quick_start.md deleted file mode 100644 index 992a1562..00000000 --- a/docs/quick_start.md +++ /dev/null @@ -1,183 +0,0 @@ - -## 1 操作流程 - -!!! Abstract "" - MaxKB 的使用操作流程一般可分为四步:添加模型、创建知识库、创建应用、发布应用。 - 在高级编排应用中还可以通过函数库的功能,实现数据处理、逻辑判断、信息提取等功能,提供更加强大、灵活的能力。 - -![操作流程](img/model/maxkb_flow.png) - -!!! Abstract "" - 下面以通用知识库为例,通过公有模型服务通义千问(本地模型部署操作,例如,DeepSeek部署,请参考[使用1Panel开源面板快速部署DeepSeek-R1](https://mp.weixin.qq.com/s/bF253jBHZIWIHvNnSMv-Rg)),快速创建智能问答应用并发布为例说明具体的操作。 - -## 2 添加模型 - -!!! Abstract "" - 登录 MaxKB 系统后,在供应商列表中选择`通义千问`,然后点击【添加模型】,进入模型配置表单配置参数如下: - - * 模型名称:MaxKB 中自定义的模型名称。 - * 权限:分为私有和公用两种权限,私有模型仅当前用户可用,公用模型即系统内所有用户均可使用,但其它用户不能编辑。 - * 模型类型:大语言模型。 - * 基础模型:通义千问支持的 LLM 模型名称,下拉选项是常用的一些大语言模型名称,支持自定义输入。 - * API Key:阿里云 DashScope灵积模型服务 API Key管理中创建和查看。 - -![通义千问 APIkey](img/model/tongyi_model.png) - -!!! Abstract "" - 不同的平台参数要求不同,其它供应商模型配置添加详情见各模型对接详细说明。 - - -## 3 创建知识库 - -!!! Abstract "" - - 打开【知识库】页面,点击【创建知识库】,输入知识库名称、知识库描述、选择内置的向量模型 MaxKB-Embedding,并设置知识库类型为通用型,然后将离线文档通过拖拽方式或选择文件上传方式进行上传。 - -### 3.1 上传文档 - -!!! Abstract "" - 上传文档要求: - - * 文本文件::Markdown、TXT、PDF、DOCX、HTML、XLS、XLSX、CSV、ZIP; - * 表格格式:Excel、CSV; - * QA 问答对:Excel、CSV; - * 每次最多上传 50 个文件; - * 每个文件不超过 100 MB; - * 支持选择文件夹,上传文件夹下符合格式要求的文件。 - - 文档规范建议: - - * 规范分段标识:离线文档的分段标识要有一定规范,否则拆分出来的段落不规整。 - * 段落要完整:一个分段中最好能描述一个完整的内容。 - -![创建通用知识库](img/dataset/create_offline_dataset.png) - -### 3.2 设置分段规则 - -!!! Abstract "" - MaxKB 支持智能分段和高级分段两种分段方式。 - - **智能分段** - - (1)MarkDown 类型的文件智能分段规则:
- - * 根据标题逐级下钻式分段,最多支持 6 级标题,每个段落最多 4096 个字符; - * 当最后一级的文本段落字符数超过设置的分段长度时,会查找分段长度以内的回车进行截取。 - - (2)HTML、DOCX 类型的智能分段规则: - - * 识别标题格式转换成 markdown 的标题样式; - * 逐级下钻进行分段,最多支持 6 级标题,每个段落最多 4096 个字符。 - - (3)TXT和 PDF 类型的文件智能分段规则: - - * 按照标题# 进行分段,若没有#标题的则按照字符数 4096 个字符进行分段; - * 查找分段长度以内的回车进行截取。 - -![智能分段]() - -!!! Abstract "" - **高级分段** - - 用户可以根据文档规范自定义设置分段标识符、分段长度及自动清洗。 - - * 分段标识支持:#、##、###、####、#####、######、-、空行、回车、空格、分号、逗号、句号,还可以手动输入分段标识符。 - * 分段长度:支持最小 50个字符,最大 100000 个字符。 - * 自动清洗:开启后系统会自动去掉重复多余的符号,例如空格、空行、制表符等。 - -![高级分段]() - -!!! Abstract "" - **导入时添加分段标题为关联问题** - - 勾选后会把所有分段的标题设置为分段的关联问题。 -![设置标题为关联问题](img/dataset/titel_set_question.png) - -!!! Abstract "" - **预览** - - 分段规则设置完成后,需要点击【生成预览】查看最新规则的分段效果。 - -![分段预览]() - -!!! Abstract "" - 可在分段预览中对不合理的分段进行再次编辑。 - -![编辑分段](img/dataset/view_edit.png) - - -!!! Abstract "" - 点击【创建并导入】后,系统后台会对文档进行自动分段 -> 存储 -> 向量化处理操作,执行完成后在知识库文档列表中各个文件状态显示为`成功`。 - -![文档列表](img/dataset/doc_list.png) - -## 4 创建应用 - -!!! Abstract "" - 点击【创建应用】,输入应用名称,选择【简易配置应用】,点击【创建】 - -![选择应用类型](img/app/selectAppType.png) - -!!! Abstract "" - 应用创建完成,进入简易配置应用的设置页面,左侧为应用信息,右侧为调试预览界面。 - - * 应用名称:用户提问时对话框的标题和名字。 - * 应用描述:对应用场景及用途的描述。 - * AI模型:在【系统设置】-【模型管理】中添加的大语言模型。 - * 提示词:系统默认有智能知识库的提示词,用户可以自定义通过调整提示词内容,引导大模型聊天方向。可对无引用知识库和引用知识库两种情况分别设置不同的提示词。 - * 历史聊天记录:大模型提交当前会话中最后 N 条对话内容,否则仅向大模型提交当前问题。 - * 关联知识库:用户提问后将在关联的知识库中检索分段。 - * 开场白:用户打开对话时,系统弹出的问候语。支持 Markdown 格式;[-]后的内容为快捷问题,一行一个。 - * 语音输入:开启后将支持语音方式进行提问,需要语音识别模型支持。 - * 语音播放:开启后可以通过语音进行播放回答,可以通过浏览器播放,也可以通选择语音合成模型。 - - 应用信息设置完成后,可以在右侧调试预览中进行提问预览,调试预览中提问内容不计入对话日志。 -![应用设置](img/app/app_setting.png) - - - -!!! Abstract "" - **知识库参数设置详细说明** - - (1)**检索模式** - - * 向量检索:使用向量模型通过向量距离计算与用户问题最相似的文本分段; - * 全文检索:通过关键词检索,返回包含关键词最多的文本分段; - * 混合检索:同时执行全文检索和向量检索,再进行重排序,从两类查询结果中选择匹配用户问题的最佳结果。 - - (2)**相似度:** 相似度越高代表问题和分段的相关性越强。 - - (3)**引用分段数:** 提问时按相似度携带 N 个分段生成提示词询问 LLM 模型。 - - (4)**引用最大字符数:** 引用分段内容设置最大字符数,超过时则截断。 - - (5)**无引用知识库处理** - - * 继续提问:可以自定义设置提示词,需要有`{question}`用户问题的占位符,才会把用户问题发送给模型。 - * 指定回复内容:当没有命中知识库分段时可以指定回复内容。 - - (6)**问题优化:** 开启后对用户提出的问题先进行一次 LLM 优化处理,将优化后的问题在知识库中进行向量化检索,能提高检索知识库的准确度,但由于多一次询问大模型会增加回答问题的时长。 - -![应用知识库参数设置]() - -!!! Abstract "" - 经过调试后,保存设置并发布。在应用列表页面,在概览页面点击演示或在浏览器中复制公开访问链接进入问答页面进行提问。 -![演示预览](img/app/app_view.png) - -## 5 应用集成 - -!!! Abstract "" - MaxKB 应用支持零编码快速嵌入第三方 Web系统。 - - 在应用概览页面,点击【嵌入第三方】,复制对应的嵌入代码,以全屏模式或浮窗模式嵌入到第三方系统中,嵌入完成后便可在第三方系统中进行问答。 - -![嵌入第三方]() - -!!! Abstract "" - 在专业版中,还可以将 MaxKB 应用接入企业微信、公众号、钉钉和飞书等移动端应用,详细说明见:[X-Pack功能-应用接入 ](./user_manual/X-Pack/app_integrate.md)。 - - - - - - diff --git a/docs/system_arch.md b/docs/system_arch.md deleted file mode 100644 index 9fced8ff..00000000 --- a/docs/system_arch.md +++ /dev/null @@ -1,17 +0,0 @@ -# 系统架构 - -## 1 整体架构 - -![架构图](img/index/arch.jpg){width="950px"} - -## 2 实现原理 - -![实现原理](img/index/Implementation principle.jpg) - -## 3 技术栈 - -!!! Abstract "" - - 前端:[vue.js](https://cn.vuejs.org/)、[LogicFlow](https://github.com/didi/LogicFlow) - - 后端:[Python / Django](https://www.djangoproject.com/)、[langchain](https://www.langchain.com/) - - 向量数据库:[PostgreSQL / pgvector](https://www.postgresql.org/) - - 大模型:[Ollama](https://github.com/ollama/ollama)、Azure OpenAI、OpenAI、Anthropic、Gemini、DeepSeek、通义千问、Kimi、百度千帆、讯飞星火等。 diff --git a/docs/user_manual/X-Pack/app_auth.md b/docs/user_manual/X-Pack/app_auth.md deleted file mode 100644 index 1fe9c06c..00000000 --- a/docs/user_manual/X-Pack/app_auth.md +++ /dev/null @@ -1,14 +0,0 @@ -# 访问限制 - - -!!! Abstract "" - MaxKB X-Pack 支持通过身份验证的方式对应用进行访问限制,进一步保障信息安全。 - -![身份验证设置](../../img/app/app_auth.png) - -!!! Abstract "" - 应用身份验证开启后,通过公开访问链接时(包括浮窗框)需要输入验证密码才可以进入问答页面。
- **说明:** 身份验证开启后,通过公开访问链接访问应用时都需要输入验证密码,包括演示以及全屏/浮窗模式嵌入,而应用接入到企业微信、公众号、钉钉、飞书则不受影响。 - -![身份验证](../../img/app/app_password1.png) -![身份验证](../../img/app/app_password2.png){width="500px"} diff --git a/docs/user_manual/X-Pack/app_integrate.md b/docs/user_manual/X-Pack/app_integrate.md deleted file mode 100644 index c6574a6e..00000000 --- a/docs/user_manual/X-Pack/app_integrate.md +++ /dev/null @@ -1,201 +0,0 @@ -# 应用接入 - - -!!! Abstract "" - MaxKB X-Pack 支持创建的应用的与企业微信应用、企业微信客服、公众号(服务号和订阅号)、钉钉应用、飞书应用接入,实现企业内部员工、外部公众进行对话。 - -### 1 企业微信应用接入 - -!!! Abstract "" - (1)在应用接入中点击【企业微信应用】的【配置】按钮,配置信息中会自动生成回调 URL,并需要复制到企业微信应用的 API 接收设置中,除此之外的其它信息,将在企业微信管理后台中生成并获取。 - -![显示设置](../../img/app/ent_wechat_setting.png) - -!!! Abstract "" - (2)获取企业ID: 在[企业微信管理后台](https://work.weixin.qq.com/wework_admin/frame#apps),点击 【我的企业】菜单,在最下方可以看到企业ID 信息。 - -![企业ID](../../img/app/enterprise_id.png) - -!!! Abstract "" - (3)创建企业微信应用:在【应用管理】中点击【创建应用】,选择应用logo,设置应用名称和应用介绍以及可见范围。 - -![创建企业微信应用](../../img/app/create_robot.png) -![企业微信应用设置](../../img/app/robot_info.png) - -!!! Abstract "" - (4)获取 Agentid 和 Secret:进入创建的应用,获取 AgentId 和 Secret。点击【查看】Secret 将通过企业微信进行查看。 - -![Agentid](../../img/app/Agentid.png) - -!!! Abstract "" - (5)获取 Token 和 EncodingAESKey:进入企业微信应用设置的【接收消息】-【设置API接收】,随机获取 Token 和EncodingAESKey。然后在 MaxKB 企业微信应用配置输入对应的参数并保存,然后再回到企业微信应用设置【接收消息】-【设置API接收】企业微信应用接入配置中自动生成的回调 URL,然后再点击【保存】。 - - **注意:** 在企业微信应用API接收消息配置保存之前,一定要在 MaxKB 中完成企业微信应用配置并保存,不然保存时将报错`openapi回调地址请求不通过`。 - -![设置API接收](../../img/app/recmsg_api.png) - - -!!! Abstract "" - **注意:** 在企业微信应用API接收消息配置保存之前,一定要在 MaxKB 中完成企业微信应用配置并保存,不然保存时将报错`openapi回调地址请求不通过`。 - -![设置API接收](../../img/app/recmsg_api_setting.png) - - - -!!! Abstract "" - (6)配置企业可信IP:进入企业微信应用设置的【企业可信IP】中,把 MaxKB 服务的IP地址设置为可信IP。 - -![企业微信对话](../../img/app/creditable_ip.png) - -!!! Abstract "" - - 以上步骤配置完成后,并在企业微信应用接入配置中输入企业微信应用信息后保存,便可在企业微信应用中找到机器人进行对话了。 - -![企业微信对话](../../img/app/enter_wechat_dialog.png) - -### 2 企业微信客服对接 - -!!! Abstract "" - MaxKB 应用接入企业微信应用后,在此基础上,还可以将此应用接入到微信客服,对外部用户提供服务。 - (1)创建客服账号:在企业微信管理后台的【应用管理】中,点击【微信客服】,并创建账号,客服账号的接待方式选择:机器人+人工接待 - -![企业微信客服账号](../../img/app/weichat_customservice.png){width="800px"} - -![企业微信客服账号](../../img/app/create_cs_account.png){width="800px"} - -!!! Abstract "" - (2)客服账号与应用关联:在微信客服中配置【可调用接口的应用】,并配置客服账号。 - -![企业微信客服账号](../../img/app/cs_app.png){width="800px"} - -![企业微信客服账号](../../img/app/config_cs_account.png){width="800px"} - -!!! Abstract "" - (3)开启客服助理:在企业的外部群设置中开启【客服助理】,微信客服便会加入群中,群里的任何用户仅需要@客服助理,即可发起咨询,并微信客服进行一对一的对话。 - -![企业微信客服账号](../../img/app/enable_cs.png){width="500px"} - -![企业微信客服账号](../../img/app/dialog_cs.png){width="500px"} - -### 3 公众号接入 - -!!! Abstract "" - (1)在应用接入中点击【公众号】的【配置】按钮,配置信息中会自动生成回调 URL,并需要复制到【微信公众平台-设置与开发-基本配置-服务器配置】服务器地址URL 中,除此之外的其它信息,将在微信公众平台中生成并获取。 -![公众号配置](../../img/app/public_account_setting_empty.png) - -!!! Abstract "" - (2)获取APP ID、APP Secret、Token和消息加解密密钥:在微信公众平台-设置与开发-基本配置中获取APP ID、APP Secret信息,并启动服务器配置,生成 Token 和消息加解密密钥。 -![公众号信息](../../img/app/public_account_basicinfo.png) -![公众号信息](../../img/app/public_account_setting1.png) - -!!! Abstract "" - (3)将生成的APP ID、APP Secret、Token 和消息加解密密钥信息输入到MaxKB 公众号配置窗口中,并保存。 -![公众号信息](../../img/app/public_account_setting2.png) - -!!! Abstract "" - (4)回到第(2)步,将【公众号-基本配置-服务器配置】中的 URL 设置为 MaxKB 公众号配置窗口中的回调地址 URL,然后提交,并启用服务器配置。 -![公众号信息](../../img/app/public_account_setting_url.png) - -!!! Abstract "" - (5)开启客服接口权限。 -![客服接口权限](../../img/app/public_account_enable_api.png) - -!!! Abstract "" - (6)设置IP白名单:进入公众号基本配置的【IP白名单】中,添加 MaxKB 服务器的 IP 地址。 -![公众号IP白名单](../../img/app/public_account_ip.png) - -!!! Abstract "" - 根据以上步骤完成配置后,即可在公众号中发送消息进行对话了。 - -![公众号对话](../../img/app/public_account_dialog.jpeg){width="500px"} - - -### 4 钉钉应用接入 - -!!! Abstract "" - (1)在应用接入中点击【钉钉应用】的【配置】按钮,配置信息中会自动生成回调 URL,并需要复制到钉钉-机器人设置-消息接收地址中,其它信息,将在钉钉开放平台中生成并获取。 -![钉钉机器人创建](../../img/app/dingding_setting.png) - -!!! Abstract "" - (2)创建机器人:在 [钉钉开放平台](https://open-dev.dingtalk.com/)的【应用开发】-【钉钉应用】中,点击【创建应用】,填写应用信息后,点击【保存】。 -![钉钉机器人创建](../../img/app/dingding_robot_create.png) - -!!! Abstract "" - (3)获取Client ID和Client Secret: 进入创建好的钉钉应用,打开【凭证与基础信息】页面,获取Client ID和Client Secret。 -![钉钉应用信息](../../img/app/dingding_info.png) - -!!! Abstract "" - (4)在MaxKB 钉钉应用配置窗口中输入步骤获取的Client ID和Client Secret 应用凭证,并保存。 -![钉钉应用信息](../../img/app/dingding_setting2.png) - -!!! Abstract "" - (5)点击【添加应用能力】,选择 【机器人】能力,点击 【添加】,输入机器人基本配置信息后,将【消息接收模式】设置为HTTP模式,并将 MaxKB 钉钉应用配置中的回调地址的URL填写到消息接收地址中,然后点击【发布】。 -![钉钉机器人添加](../../img/app/dingding_robot_add.png) -![钉钉机器人息接收模式](../../img/app/dingding_msg_recvmode.png) - -!!! Abstract "" - 根据以上步骤完成配置后,就可以群里@机器人中进行对话,或与机器人应用一对一对话。 -![钉钉对话](../../img/app/dingding_dialog.jpeg){width="500px"} - -### 5 飞书应用接入 - -!!! Abstract "" - (1)在应用接入中点击【飞书应用】的【配置】按钮,配置信息中会自动生成回调 URL,并需要复制到【飞书开放平台-事件与回调-事件配置-配置订阅方式】的请求地址中,除此之外的其它信息,将在飞书开放平台中生成并获取。 - -![飞书应用配置](../../img/app/feishu_setting.png) - -!!! Abstract "" - (2)创建飞书机器人:首先在 [飞书开发平台](https://open.feishu.cn/app/)的【企业自建应用】中,点击【创建企业自建应用】,填写应用信息。 -![飞书添加机器人](../../img/app/feishu_create_app.png) - -!!! Abstract "" - 点击【添加应用能力】,选择 【按能力添加-机器人】,点击【添加】 -![飞书添加机器人](../../img/app/feishu_add_robot.png) - -!!! Abstract "" - (3)添加权限:打开【权限管理】,复制下面的权限配置并粘贴到【API权限-权限配置】输入框,全选筛选出来的权限项,点击【批量开通】,最后点击【确认】。 - - ``` - m:message,im:message.group_at_msg:readonly,im:message.p2p_msg:readonly,im:message:send_as_bot,im:resource, contact:contact.base:readonly,contact:user.base:readonly - ``` - -![飞书权限](../../img/app/feishu_app_auth.png) - -!!! Abstract "" - (4)获取APP ID、APP Secret和Verification Token:进入创建好的飞书应用,打开【凭证与基础信息】页面,获取APP ID和APP Secret。 -![飞书应用信息i](../../img/app/feishu_app_info.png) - - -!!! Abstract "" - 打开【事件与回调-加密策略】,获取 Verification Token。 - -![飞书token](../../img/app/feishu_verify_token.png) - -!!! Abstract "" - (5)在MaxKB 飞书应用配置窗口输入上述信息,并保存。 - -![飞书事件与回调](../../img/app/maxkb_feishu_config.png) - - -!!! Abstract "" - (6)配置回调URL:在飞书开放平台中打开【事件与回调】-【回调配置】的订阅方式中,将MaxKB中飞书应用的回调地址的URL填写到【请求地址】中。 -![飞书事件与回调](../../img/app/feishu_event_config1.png) - -![飞书事件与回调](../../img/app/feishu_event_config2.png) - - -!!! Abstract "" - (7)发布应用:点击【创建版本】,填写版本信息后,点击【保存】发。 -![飞书应用发布](../../img/app/feishu_app_create1.png) - -![飞书应用发布](../../img/app/feishu_app_create2.png) - -!!! Abstract "" - 确认发布后,应用状态将更新为`已启用`。 -![飞书应用发布](../../img/app/feishu_app_enabled.png) - -!!! Abstract "" - 根据以上步骤完成配置后,即可打开飞书客户端搜索`MaxKB小助手`,点击【添加】后进行一对一对话。 -![飞书对话](../../img/app/feishu_app_search.jpg){width="500px"} - -![飞书对话](../../img/app/feishu_dialog.jpeg){width="500px"} diff --git a/docs/user_manual/X-Pack/app_logo_settting.md b/docs/user_manual/X-Pack/app_logo_settting.md deleted file mode 100644 index 2afc429a..00000000 --- a/docs/user_manual/X-Pack/app_logo_settting.md +++ /dev/null @@ -1,10 +0,0 @@ -# 应用显示设置 - -!!! Abstract "" - 在【应用】的【显示设置】中,除了支持显示知识的来源,专业版还支持更丰富的配置,包括应用对话框主题颜色、字体颜色、提问用户头像、AI回复头像、浮窗入库入口图标以及位置、历史记录、引导图以及免责声明等。 - -![显示设置](../../img/app/view_setting.png) - -!!! Abstract "" - 应用显示配置效果示例图: -![对话框](../../img/app/app_fuchuang.jpg) \ No newline at end of file diff --git a/docs/user_manual/X-Pack/login_auth.md b/docs/user_manual/X-Pack/login_auth.md deleted file mode 100644 index 070cb1b2..00000000 --- a/docs/user_manual/X-Pack/login_auth.md +++ /dev/null @@ -1,126 +0,0 @@ -# 登录认证 -!!! Abstract "" - MaxKB专业版支持 LDAP、CAS、OIDC、OAUTH2 单点认证协议,以及企业微信、钉钉、飞书移动端扫码登录验证,满足企业对于强身份验证和访问控制的需求。 - -## 1 LDAP - -!!! Abstract "" - 配置 LDAP 的过程可参考下图,注意勾选下方"启用 LDAP 认证"后开启此功能。 - 提示:配置完成可点击上方【测试连接】即时测试配置信息是否正确,网络是否连通。 -![LDAP](../../img/system/LDAP.png) - - -## 2 CAS - -!!! Abstract "" - 配置 CAS 的过程可参考下图,注意勾选下方"启用 CAS 认证"后开启此功能。 - **说明:** CAS 回调地址即 MaxKB 访问地址加上`/api/cas`,例如:`http://40.100.86.240:8080/api/cas` -![CAS](../../img/system/CAS.png) - - -## 3 OIDC - -!!! Abstract "" - 配置 OIDC 的过程可参考下图,注意勾选下方"启用 OIDC 认证"后开启此功能。 - **说明:** OIDC 回调地址即 MaxKB 访问地址加上`/api/oidc`,例如:`http://40.100.86.240:8080/api/oidc` -![OIDC](../../img/system/OIDC.png) - -## 4 OAUTH2 - -!!! Abstract "" - 配置 OAUTH2 的过程可参考下图(授权端以 github 为例),注意勾选下方"启用 OAHTU2 认证"后开启此功能。 - **说明:** OAUTH2 回调地址即 MaxKB 访问地址加上`/api/oauth2`,例如:`http://40.100.86.240:8080/api/oauth2` -![OAHTU2](../../img/system/oauth2.png) - -## 5 扫码登录 - -### 5.1 企业微信扫码登录 - -!!! Abstract "" - 企业微信扫码登录配置参数说明: - - - Corp ID: 企业ID,企业微信管理员在管理后台的【企业信息】中获取。 - - Agent ID:企业微信自建应用唯一标识,企业微信管理在管理后台创建或查看应用时获取。 - - App Secret:企业微信自建应用的密钥。 - - 回调地址:即 MaxKB 访问URL。 - -!!! Abstract "" - MaxKB 配置企业微信扫码登录时,需要企业微信管理员登录 [企业微信管理管理](https://work.weixin.qq.com/wework_admin/frame) 并创建企业自建应用,完成配置后发布应用。 - 第一步:创建应用。在【应用管理-应用-自建】中点击【创建应用】,输入应用名称等信息,应用创建完成后即可查看应用Agent ID和Secret。 -![企微应用创建](../../img/system/qiwei_create_app.png){width="500px"} - -![企微应用信息](../../img/system/qiwei_appinfo.png){width="500px"} - -!!! Abstract "" - 第二步:设置可信域名。在【开发者接口】中点击【设置可信域名】,添加可信域名,并进行校验。 -![设置可信域名](../../img/system/qiwei_yuming.png){width="500px"} - -!!! Abstract "" - 第三步:授权回调域。在【企业微信授权】中设置授权回调域。 -![设置回调域](../../img/system/qiwei_callback.png){width="500px"} - -!!! Abstract "" - 第三步:配置企业可信IP。在【企业可信IP】中配置可信ip。 -![配置可信IP](../../img/system/qiwei_ip.png){width="500px"} - -!!! Abstract "" - 完成企业微信应用的配置和发布后,在 MaxKB 企业微信登录扫码配置页面配置相应信息并通过效验。 -![企业微信配置](../../img/system/qiwei_setting.png) - -### 5.2 钉钉扫码登录 - -!!! Abstract "" - 钉钉扫码登录配置参数说明: - - - Corp ID:钉钉组织标识,在钉钉开放平台中右上方组织信息中查看。 - - APP Key:钉钉应用标识,在钉钉开放平台中查看应用【凭证与基础信息】中查看。 - - App Secret:钉钉应用秘钥,在钉钉开放平台中查看应用【凭证与基础信息】中查看。 - - 回调地址:即 MaxKB 访问URL。 - -!!! Abstract "" - MaxKB 配置钉钉扫码登录时,需要在 [钉钉开放平台](https://open-dev.dingtalk.com/) 创建应用并进行配置。 - - 第一步:创建应用。在【应用开 发-钉钉应用】中点击【创建应用】,应用创建完后在【凭证与基础信息】可查案APPKey和 APPSecret信息。 -![钉钉创建应用](../../img/system/dingding_app_create.png) -![钉钉应用信息](../../img/system/dingding_app_info.png) - -!!! Abstract "" - 第二步:发布应用。在【版本管理与发布】中,填写应用版本号、版本描述等信息,点击【保持】,发布应用。 -![钉钉应用信息](../../img/system/dingding_app_release.png) - -!!! Abstract "" - 完成配置后发布,然后在 MaxKB 钉钉扫码登录扫码配置页面进行配置并保存。 -![钉钉创建应用](../../img/system/dingding_setting.png) - -### 5.3 飞书扫码登录 - -!!! Abstract "" - 飞书扫码登录配置参数说明: - - - APP Key: - - Corp ID: - - App Secret:MaxKB提供的回调地址,并作为飞书免登录授权的跳转地址。 - - 回调地址:即 MaxKB URL地址 + '/api/feishu',例如:`http://40.100.86.243/api/feishu`。 - -![飞书配置](../../img/system/feishu_setting.png) - -!!! Abstract "" - MaxKB 配置飞书扫码登录时,需要在 [飞书开放平台](https://open.feishu.cn/) 创建企业自建应用,完成配置后发布,然后在 MaxKB 飞书扫码登录扫码配置页面进行配置并保存。 - -!!! Abstract "" - 第一步:创建企业自建应用。点击【创建企业自建应用】,输入应用名称、描述以及上传应用图标后,点击【创建】。 -![飞书创建](../../img/system/feishu_create_app.png) - -!!! Abstract "" - 第二步:配置重定向URL。在【开发配置-安全设置】中,输入MaxKB 飞书扫码配置弹出框中的回调地址,点击【添加】。 -![飞书配置回调URL](../../img/system/feishu_url.png) - -!!! Abstract "" - 第三步:发布应用。在【版本管理与发布】中,输入应用版本号、更新说明等信息,点击【保存】,完成应用发布。 -![飞书发布应用](../../img/system/feishu_app_release.png) - -## 6 登陆认证 - -!!! Abstract "" - 完成认证信息配置后,在登陆页面点击选择对应的认证方式进行登陆。 -![登陆认证](../../img/system/auth_login.png) diff --git a/docs/user_manual/X-Pack/system_API.md b/docs/user_manual/X-Pack/system_API.md deleted file mode 100644 index a10c4c9f..00000000 --- a/docs/user_manual/X-Pack/system_API.md +++ /dev/null @@ -1,22 +0,0 @@ -# 系统API - -## 1 API Key 管理 - -!!! Abstract "" - 在页面右上方登陆用户图标下拉菜单中,点击「API Key管理」菜单,进入API Key 管理窗口,可以创建、启用/关闭、删除、设置 API Key等操作。 - -![API-key](../../img/system/apikey.png) - -!!! Abstract "" - 创建 API Key之后,可以配置是否允许跨域地址,默认不允许。 - -![API-key](../../img/system/apikey_setting.png) - -## 2 API 调试 - -!!! Abstract "" - 打开 API 文档地址后,输入 API Key 进行授权,即可进行 API 在线调试。 - -![swagger](../../img/system/swagger_api.png) - - diff --git a/docs/user_manual/X-Pack/theme_settings.md b/docs/user_manual/X-Pack/theme_settings.md deleted file mode 100644 index 3048654b..00000000 --- a/docs/user_manual/X-Pack/theme_settings.md +++ /dev/null @@ -1,7 +0,0 @@ - -# 外观设置 - -!!! Abstract "" - MaxKB 专业版可设置系统的主题色、网站 logo、登录 logo、登录背景图、网站名称、slogan等,以及主页右上方用户手册、论坛求助、项目地址等平台信息的显示设置。 - -![主题设置](../../img/system/theme.png) \ No newline at end of file diff --git a/docs/user_manual/X-Pack/user.md b/docs/user_manual/X-Pack/user.md deleted file mode 100644 index 3563ce92..00000000 --- a/docs/user_manual/X-Pack/user.md +++ /dev/null @@ -1,16 +0,0 @@ -# 用户管理 - -!!! Abstract "" - admin 系统管理员可以在【用户管理】中可以对用户的基本信息进行管理,包括用户的姓名、邮箱、密码、启停用状态等。 - -![用户列表](../../img/system/user.png) - -!!! Abstract "" - 在用户列表页的上方,点击【创建用户】按钮,在弹出的对话框中输入要新建用户的基本信息,如用户名(登录名,不可修改)、姓名、手机号码、邮箱、密码等。输入完成后, 点击【保存】按钮。 -![创建用户](../../img/system/add_user.png) - -!!! Abstract "" - 第三方用户如 LDAP 用户登录后,系统会自动创建一个用户类型为LDAP的用户,且用户可以使用普通登录方式进行登录。 - - **注意:如果用户删除,则该用户创建的资源在删除用户时会一起删除。** - diff --git a/docs/user_manual/app/app-view.md b/docs/user_manual/app/app-view.md deleted file mode 100644 index cc9dd9cf..00000000 --- a/docs/user_manual/app/app-view.md +++ /dev/null @@ -1,43 +0,0 @@ - -# 应用概览 - -!!! Abstract "" - 在应用列表页面,点击应用的面板,进入到应用概览页面。 - 在概览页面可以进行启用/禁用/重新生成公开访问链接、演示、嵌入第三方、访问限制以及 API Key 管理。 - -![应用概览](../../img/index/UI.jpg) - -## 1 公开访问链接 - -!!! Abstract "" - 点击演示或复制公开访问链接至浏览器进入问答页面。 - -![问答](../../img/app/QA.png) -!!! Abstract "" - 公开访问链接支持开关设置和重新生成。 - 对于已打开的公开链接,如果此时关闭当前公开链接或重新生成新的公开访问链接,此时访问将提示:抱歉,当前正在维护,无法提供服务,请稍后再试! - -![关闭服务](../../img/app/app-closed.png) - -## 2 嵌入第三方 - -!!! Abstract "" - MaxKB 应用支持零编码嵌入到企业的第三方系统。 - 在应用概览页面,点击【嵌入第三方】,用户可以复制全屏模式代码或浮窗模式代码嵌入到第三方系统中,嵌入完成后便可在第三方系统中进行问答。 - -![嵌入第三方](<../../img/app/embed.png>) - -## 3 访问限制 - -!!! Abstract "" - MaxKB 支持对应用设置每个客户端提问次数限制和嵌入第三方白名单防盗链设置,并且支持设置用户端是否显示知识来源。 - -![访问限制](<../../img/app/Access restrictions.png>) - - -## 4 API 访问凭据 - -!!! Abstract "" - 如果外部系统需要通过 API 的方式进行调用,需要查看 API 文档和当前应用的 API Key,点击 【API Key 】,打开 API Key 的管理对话框,支持创建、启用/禁用、删除 API Key。 - -![API key](../../img/app/app_apikey.png) \ No newline at end of file diff --git a/docs/user_manual/app/hit-testing.md b/docs/user_manual/app/hit-testing.md deleted file mode 100644 index ea4997da..00000000 --- a/docs/user_manual/app/hit-testing.md +++ /dev/null @@ -1,7 +0,0 @@ - -# 命中测试 - -!!! Abstract "" - 应用命中测试功能是简易配置类型应用针对用户提问进行一个模拟测试,用来调整分段内容和关联问题从而提高分段内容的匹配度,从而提升回答效果。输入测试问题,系统根据检索模式在当前应用关联的知识库中进行检索,然后按照相似度和返回Top 分段数筛选返回满足条件的分段。如有必要,可对指定返回分段内容进行再次编辑。 - -![命中测试](../../img/app/app_hittesting.png) \ No newline at end of file diff --git a/docs/user_manual/app/log.md b/docs/user_manual/app/log.md deleted file mode 100644 index 85a02f2d..00000000 --- a/docs/user_manual/app/log.md +++ /dev/null @@ -1,20 +0,0 @@ - -!!! Abstract "" - 在对话日志记录了所有用户会话中的问答详情,包括用户对AI 回答的反馈信息,维护人员可以通过查看对话日志详情并参考用户反馈进一步修正答案。 - 在对话日志支持查询过去 7 天、30 天、90 天、过去半年的对内容,以及按摘要和用户反馈查询进行查询。 - -## 1 日志详情 - -!!! Abstract "" - 日志详情为每个用户真实的问答场景,问答中用户的反馈只能查看不能修改。 - -![日志详情](../../img/app/loglist.png) - -!!! Abstract "" - 点击日志列表中的摘要,可查看对话详细内容。 - -![引用分段](../../img/app/log_detail.png) - -!!! Abstract "" - 运营人员可以根据用户提问、AI 回答以及用户的反馈来编辑和标注,以进一步完善并提升效果。 -![引用分段](../../img/app/log_details_edit.png) \ No newline at end of file diff --git a/docs/user_manual/app/serialization.md b/docs/user_manual/app/serialization.md deleted file mode 100644 index 719f0be6..00000000 --- a/docs/user_manual/app/serialization.md +++ /dev/null @@ -1,16 +0,0 @@ -# 应用导出与导出 - -## 1 应用导出 - -!!! Abstract "" - 应用支持导出操作,导出后文件名称为:应用名称.mk。 - 对于高级编排类型的应用,导出内容为包括工作流中所有节点的参数设置以及函数内容,流程节点中所选择的知识库和模型信息不导出。 - -![应用导出](<../../img/app/app_export.png>){ width="500px" } - -## 2 应用导入 - -!!! Abstract "" - 在应用页面,点击【导入应用】,即可导入应用文件(文件后缀为.mk)。 - -![应用导入](<../../img/app/app_import.png>){ width="500px" } \ No newline at end of file diff --git a/docs/user_manual/app/simple_app.md b/docs/user_manual/app/simple_app.md deleted file mode 100644 index 55bb9966..00000000 --- a/docs/user_manual/app/simple_app.md +++ /dev/null @@ -1,29 +0,0 @@ -# 简单配置应用 - -!!! Abstract "" - 点击【创建应用】,输入应用名称以及应用描述,选择【简易配置】,点击【创建】,进入简易配置应用设置页面。 - -![选择应用类型](../../img/app/selectAppType.png) - -!!! Abstract "" - 左侧为应用信息,右侧为调试预览界面。 - - * 应用名称:提问时对话框的标题和名字。 - * 应用描述:对应用场景及用途的简要描述。 - * AI模型:可选择在【系统设置】-【模型管理】中添加的大语言模型,也可直接添加。 - * 角色设定:通过给模型指定一个特定的角色或身份,来指导模型的输出更加符合特定的场景或任务需求。 - * 提示词:系统默认有智能知识库的提示词,用户可以自定义通过调整提示词内容,可以引导大模型聊天方向,该提示词会被固定在上下文的开头。可以使用变量,例如:{data} 是引用知识库中已知信息,{question}是用户提出的问题。目前可针对是否引用知识库设置不同的提示词。 - * 历史聊天记录:大模型提交当前会话中最后 N 条对话内容,否则仅向大模型提交当前问题。 - * 关联知识库:用户提问优先在关联的知识库中检索分段,引用分段生成提示词发送给大模型进行询问。若未关联知识库或未匹配到分段内容,则默认将用户问题发送给大模型进行询问。知识库可设置检索方式、知识库的相似度,引用分段数 Top-N 和最大引用字符数、无引用知识库分段时的回答策略以及是否进行问题优化等。 - * 开场白:打开对话时,系统弹出的默认引导说明。支持 Markdown 格式,[-]后的内容为快捷问题,一行一个。 - * 语音输入:在语音输入完成后会转化为文字后再发送提问,需要语音识别模型的支持。 - * 语音播放:将大模型生成的回答内容转换为语音进行播放,需要语音合成模型的支持。 - - -!!! Abstract "" - 应用信息设置完成后,可在右侧调试预览中进行提问测试,调试过程不计入对话日志。
- 点击【保存并发布】后,应用设置才生效。 - -![应用设置](../../img/app/app_setting.png) - - diff --git a/docs/user_manual/app/workflow_app.md b/docs/user_manual/app/workflow_app.md deleted file mode 100644 index 34875701..00000000 --- a/docs/user_manual/app/workflow_app.md +++ /dev/null @@ -1,385 +0,0 @@ -# 高级编排应用 - -!!! Abstract "" - 点击【创建应用】,输入应用名称,选择【高级编排】,点击【创建】,进入工作流编排页面。 - -![选择应用类型](../../img/app/app_workflow.png) - -!!! Abstract "" - 新创建的高级编排应用会默认生成简易工作流,可以根据自己的需求进行自定义编排,点击发布后生效。
- - **注意:** - - - 画布上的节点必须在工作流程中,不能有流程外的孤立节点,否则在发布时会校验失败。
- - 每个节点可以根据节点的用途进行重命名,双击节点名称即可重命名,但同一个工作流编排中节点名称不能重复。
- - 连线的后置节点可以引用前置节点的输出参数,如果节点名称变更,需要重新复制变量,参数引用方式是`{{节点名称.变量名称}}`。 - -!!! Abstract "" - 完成工作流程设计之后,使用左下方的画布控制栏,可以对画布进行整体调整,包括画布缩放、节点收缩以及流程一键优化。 - -![默认画布](../../img/app/defult_workflow.png) - -## 1 基础组件 - -!!! Abstract "" - 每个工作流都有基本信息与开始两个基础节点: - - * 基本信息:应用的基本信息设置节点,如应用名称、描述、开场白等设置,每个应用只有一个基本信息节点,不能删除和复制。 - * 开始:工作流程的开始,每个应用只能有一个开始节点,不能删除和复制。 - -!!! Abstract "" - 点击右上角的【添加组件】,可以点击或拖拽到画布进行工作流编排。以下是每个组件的用途说明: - - * AI对话:与AI大模型进行对话节点。 - * 图片理解:识别并理解图片所包含的信息。 - * 图片生成:根据提供的文本内容生成图片。 - * 知识库检索:关联知识库,检索与问题相关分段的节点。 - * 多路召回:使用重排模型对多个知识库的检索结果进行二次召回。 - * 判断器:根据不同条件执行不同的节点。 - * 指定回复:直接指定回复内容。 - * 表单收集:通过表单的方式收集问答所需要的必要信息。 - * 问题优化:AI对话的一种,设定了默认的角色和提示词,根据上下文优化问题。 - * 文档内容提取:提取文档中的内容。 - * 语音转文本:将音频转换为文本。 - * 文本转语音:将文本转换为语音。 - * 变量赋值:更新全局变量的值。 - -![编排画布](../../img/app/workflow.png) - -### 1.1 基本信息 - -!!! Abstract "" - 节点说明:工作流的开始节点,有且唯一,不能删除和复制,问答页面输入的问题会作为该节点的输出参数{question},后续节点如需引用可以复制输出参数或选择变量:`开始节点->用户问题`。 - -![开始节点](../../img/app/start_node.png){width="500px"} - -!!! Abstract "" - - - 文件上传: 开启后应用将支持在对话时上传文档(TXT、MD、DOCX、HTML、CSV、XLSX、XLS、PDF)、图片(JPG、JPEG、PNG、GIF)以及音频文件(MP3、WAV、OGG、ACC、M4A),每次最多上传 10 个,单个文件不超过 100 MB,在后续节点中可以对上传后的文件进行处理。 - -![开始节点-文件上传](../../img/app/upload_config.png){width="500px"} - -!!! Abstract "" - - 用户输入:在会话开始时,需要在用户端提供的必要信息,例如,岗位角色等,以便后续流程可以根据不同输入进行不同的流程设计。 - -![开始节点-用户输入](../../img/app/user_input.png){width="600px"} - -!!! Abstract "" - - - 接口传参:在通过应用公开访问链接时可配置的参数。添加接口参数后将会在公开访 URL 自动增加接口参数,在与第三方系统集成。 - - 语音输入:开启后将支持以语音的方式进行问题的输入,需要使用语音识别模型。 - - 语音播放:开启后回答内容将以语音的方式进行播放,可以使用浏览器内置的播放,也可以使用语音合成模型进行摸播放。 - -### 1.2 开始 - -![开始节点-用户输入](../../img/app/app_start.png) - -!!! Abstract "" - 全局变量: - - - 当前时间 {time}:当前对话的时间。 - - 历史聊天记录 {history_context}:对话的历史记录。 - - 对话id {chat_id}:对话标识。 - -!!! Abstract "" - 参数输出: - - - 用户问题 {question}:客户端输入的提问信息。 - - 文档 {document}:客户端上传的文档。 - - 图片 {image}: 客户端上传的图片文件。 - - 音频 {audio}: 客户端上传的音频文件。 - -### 1.3 AI 对话 - -!!! Abstract "" - 节点说明:如果应用需要与AI大模型进行对话,则需要在编排中添加 AI 对话组件,选择 AI 模型,设置提示词,提示词可以引用前置节点的参数输出,如:可以引用前置知识库检索的检索结果和开始节点的问题变量。 - -![AI对话](../../img/app/ai_chat.png) - -!!! Abstract "" - 节点设置: - - - AI 模型:大语言模型的名称以及参数控制。 - - 角色设定:大语言模型回答的角色或身份设定。 - - 提示词:引导模型生成特定输出的详细描述。 - - 历史聊天记录:在当前对话中有关联的历史会话内容。例如,历史聊天记录为1,表示当前问题以及上一次的对话内容一起输送给大模型。 - - 返回内容:是否在对话中显示该节点返回的内容。 - -!!! Abstract "" - 参数输出: - - - AI回答内容 {answer}:根据角色、提示词等内容大语言模型返回的内容。 - -### 1.4 图片理解 - -!!! Abstract "" - 节点说明:对用户上传的图片文件进行分析和理解。 - -![图片理解](../../img/app/picture_extract.png) - -!!! Abstract "" - 节点设置: - - - 图片理解模型:图片理解模型名称。 - - 角色设定:回答的角色或身份设定。 - - 提示词:引导模型生成特定输出的详细描述。 - - 历史聊天记录: - - 选择图片:待理解和分析的图片,默认为当前用户上传的图片文件。 - - 返回内容:是否在对话中显示该节点返回的内容。 - -!!! Abstract "" - 参数输出: - - - AI回答内容{answer}:根据上传的图片以及角色、提示词等信息图片理解模型返回的内容。 - -### 1.5 图片生成 - -!!! Abstract "" - 节点说明:根据文本描述生成对应的图片。 -![图片生成](../../img/app/vision_gen.png){width="300px"} - -!!! Abstract "" - 节点设置: - - - 图片生成模型:图片生成模型名称。 - - 提示词(正向):引导模型生成积极、建设性输出的文字输入。 - - 提示词(负向):不应该包含在生成输出中的元素、主题或特征的描述。 - - 返回内容:是否在对话中显示该节点返回的内容。 - -!!! Abstract "" - 参数输出: - - - AI回答内容 {answer}:即图片生成模型根据文本输入生成的图片。 - - 图片 {image}: 生成图片的详细信息。 - -### 1.6 知识库检索 - -!!! Abstract "" - 节点说明:如果应用需要关联知识库,则需要在编排中添加知识库检索节点,选择知识库、设置检索参数、选择检索的问题。 -![知识库检索](../../img/app/dataset_search.png) - -!!! Abstract "" - 节点设置: - - - 知识库:待检索的知识库。 - - 检索参数:包括检索模式、相似度阈值、引用分段数量以及最大引用字符数。 - - 检索问题:一般是开始节点的用户问题。 - -!!! Abstract "" - 参数输出: - - - 检索结果的分段列表 {paragraph_list}:数组类型,指根据检索问题、检索参数进行检索后命中的分段列表,包含了分段的所有属性; - - 满足直接回答的分段列表 {is_hit_handling_method_list}:数组类型,指根据检索问题、检索参数进行检索后命中的分段中满足直接回答的所有分段列表,包含了分段的所有属性; - - 检索结果 {data}:字符串类型,指根据检索问题、检索参数进行检索后命中的分段内容; - - 满足直接回答的分段内容 {directly_return}:字符串类型,指根据检索问题、检索参数进行检索后命中的分段中满足直接回答的所有分段内容。 - -### 1.7 多路召回 - -!!! Abstract "" - 节点说明:根据需要重排的内容、检索问题以及检索参数进行多路召回。 -![多路召回](../../img/app/rerank.png) - -!!! Abstract "" - 节点设置: - - - 重排内容:待重排的多个内容,一般是多个不同知识库的检索结果。 - - 检索参数:包括 score 阈值、引用分段数以及最大引用字符数。 - - 检索问题:根据检索问题进行重排,一般为用户问题或问题优化后的结果。 - - 重排模型:需要使用的重排模型名称。 - -!!! Abstract "" - 参数输出: - - - 重排结果列表 {result_list}:数组类型,指根据重排后的结果列表。 - - 重排结果 {result}:字符串类型,指根据检索参数后的重排结果。 - -### 1.8 判断器 - -!!! Abstract "" - 节点说明:根据不同的条件进行逻辑判断,每个判断分支后面必须有后置执行节点。 -![判断器](../../img/app/condition_statement.png) - -!!! Abstract "" - 判断器节点输出参数说明: - - - 分支名称{branch_name}:每个判断分支的名称。 - -### 1.9 指定回复 - -!!! Abstract "" - 节点说明:指定输出文本内容,在知识库查询到的相关内容满足直接回答的要求,可以输出检索内容,也可以在知识库没有查询到关联内容时,指定回复内容。 - -![指定回复](../../img/app/direct_reply.png) - - -!!! Abstract "" - 指定回复节点输出参数说明: - - * 内容{answer}: 指定回复输出的内容。 - -### 1.10 表单收集 - -!!! Abstract "" - 节点说明:通过表单的设计,以引导的方式主动获取必要的信息,一般应用于需要多次询问的应答场景。 - -![表单收集](../../img/app/form.png) - -!!! Abstract "" - 节点设置: - - - 表单输出内容:表单提示说明以及表单内容,可以单项输入,也可以输入多项信息。 - - 表单配置:通过添加不同的组件进行表单的设计。 - -!!! Abstract "" - 参数输出: - - - 表单全部内容{form_data}:表单的全部内容。 - - 表单全部内容将作为固定的输出,对于各个表单项也都进行参数化输出。 - -### 1.11 问题优化 - -!!! Abstract "" - 节点说明:根据当前会话的历史聊天记录,以及在节点设置的大预言模型和提示词,对当前问题进行智能优化。 -![问题优化](../../img/app/question_opt.png) - -!!! Abstract "" - 节点设置: - - - AI 模型:大语言模型的名称以及参数控制。 - - 角色设定:大语言模型回答的角色或身份设定。 - - 提示词:引导模型生成特定输出的详细描述。 - - 历史聊天记录:在当前对话中有关联的历史会话内容。例如,历史聊天记录为1,表示当前问题以及上一次的对话内容一起输送给大模型。 - - 返回内容:是否在对话中显示该节点返回的内容。。 - -!!! Abstract "" - 参数输出: - - - 问题优化结果 {answer}:通过大模型优化后的问题。 - -### 1.12 文档内容提取 - -!!! Abstract "" - 节点说明:对用户上传的文档进行内容总结。 - -![文档内容提取](../../img/app/doc_extract.png) - -!!! Abstract "" - 节点设置: - - - 选择文档:即用户上传的文档,需要在基本信息节点开启对文件上传的支持。 - -!!! Abstract "" - 参数输出: - - - 文档输出 {content}:对用户上传文件进行的总结输出。 - -### 1.13 语音转文本 - -!!! Abstract "" - 节点说明:将音频文件转换为文本。 -![语音转文本](../../img/app/audio2text.png){width="280px"} - -!!! Abstract "" - 节点设置: - - - 语音识别模型:选择语音识别模型的名称。 - - 语音文件:即上传的音频文件,支持的格式包括:mp3、wav、ogg、acc。 - - 返回内容:是否在对话中显示该节点返回的内容。 - -!!! Abstract "" - 参数输出: - - - 结果 {result}:语音转换后的文本内容。 - - -### 1.14 文本转语音 - -!!! Abstract "" - 节点说明:将文本转换为音频。 -![文本转语音](../../img/app/text2audio.png){width="280px"} - -!!! Abstract "" - 节点设置: - - - 语音合成模型:选择可用语音合成模型的名称。 - - 文本内容:选择待合成的文本内容。 - - 返回内容:是否在对话中显示该节点返回的内容。 - -!!! Abstract "" - 参数输出: - - - 结果 {result}:将文本转成的音频内容。 - -### 1.15 变量赋值 - -!!! Abstract "" - 节点说明:更新全局变量的值。 - -![变量赋值](../../img/app/reset_var.png){width="280px"} - - -## 2 添加函数 - -!!! Abstract "" - 在高级编排流程中,可以添加函数库函数作为流程中的一个处理节点,以灵活处理复杂需求,函数详细说明见:[函数 ](../fx/fx.md)。 - -![添加函数](../../img/app/app_function.png) - -!!! Abstract "" - 节点设置:即函数的输入参数。 - -!!! Abstract "" - 参数输出:即函数的返回结果。 - -## 3 添加应用 - -!!! Abstract "" - 在高级编排流程中,可以添加其它应用(简单配置应用和流程编排应用)作为流程中的一个处理节点,直接快速利用子应用的问答结果。 - -![添加函数](../../img/app/app_subapp.png) - -!!! Abstract "" - 节点设置: - - - 用户问题:对子应用的提问信息。 - - 返回内容:开启后在对话过程中将子应用的返回结果。 - -!!! Abstract "" - 参数输出: - - - 结果:即子应用的返回结果。 - -## 4 执行条件 - -!!! Abstract "" - MaxKB 工作流中支持多出多进,在这个情况下,汇集节点可以根据与前置节点的逻辑关系,选择执行条件。 - - - ALL:需要等所有前置连线节点全部执行完成后,才可执行当前节点。 - - ANY:任一前置连线节点执行完成后,即可执行当前节点。 - -![执行条件](../../img/app/node_condition.png){width="280px"} - -## 5 调试 - -!!! Abstract "" - 完成所有的编排设计后,可点击【调试】后,先校验流程是否合规,校验通过后可在当前页面进行对话测试。 - -![调试预览](../../img/app/workflow_view.png) - -!!! Abstract "" - 在调试对话框中进行提问,AI回答完成后,会显示【执行详情】,点击【执行详情】后,在弹出执行详情对话框中可以查看每个流程节点的执行状态、耗时以及其它执行信息。 - -![执行详情](../../img/app/exec_detail.png) - -## 6 保存 - -!!! Abstract "" - 高级编排流程默认手动保存,也可设置自动保存,开启自动保存后将每隔 1 分钟保存到本地,并在发布成功后将配置同步到后台数据库。 - -![自动保存](../../img/app/auto_save.png) - -## 7 发布 - -!!! Abstract "" - 点击【发布】后会先校验当前工作流是否符合规则,如果合规将成功发布,否则发布失败。发布成功后,所有节点配置修改才在问答页面中生效。可以查看发布历史并进行版本恢复。 diff --git a/docs/user_manual/dataset/dataset.md b/docs/user_manual/dataset/dataset.md deleted file mode 100644 index c66733b7..00000000 --- a/docs/user_manual/dataset/dataset.md +++ /dev/null @@ -1,163 +0,0 @@ -# 知识库 - -!!! Abstract "" - 企业私有的专业知识库,包含各种类型的数据,是问答对话中回答用户问题的知识来源。MaxKB 中知识库分为通用型知识库和 Web 站点知识库两种类型。 - - * **通用型知识库**:对离线文档上传管理,支持的文本文件、表格以及 QA 问答对。 - * **Web 站点知识库**:用于获取在线静态文本数据管理,输入 Web 根地址后自动同步根地址及子级地址的文本数据。 - - MaxKB 支持知识库创建、重新向量化、设置、同步、导出、删除等功能。 - -## 1 创建知识库 - -!!! Abstract "" - 打开【知识库】页面,点击【创建知识库】,进入创建知识库页面。 - -![dataset](../../img/dataset/create.jpg) - -### 1.1 通用型知识库 - -!!! Abstract "" - 输入知识库名称、知识库描述,选择向量模型并设置知识库类型为通用型,然后将离线文档通过拖拽或选择文件方式进行上传。 - 上传文档要求: - - * 文本文件:Markdown、TXT、PDF、DOCX、HTML、XLS、XLSX、CSV、ZIP; - * 表格:XLS、XLSX、CSV、ZIP; - * QA 问答对:XLS、XLSX、CSV、ZIP; - * 每次最多上传 50 个文件; - * 每个文件不超过 100 MB; - * 支持选择文件夹,上传文件夹下符合要求的文件。 - -!!! Abstract "" - **说明:** ZIP 文件包括两种形式: - - * MarkDown 文档 + 图片文件,MarkDown 文档中引入对应的图片,并将两者打包在 ZIP 中。 - * XLS/XLSX 文件 + 图片文件,XLS/XLSX 文件中引入对应的图片,并将两者打包在 ZIP 中。 - -![上传文档](../../img/dataset/create_offline_dataset.png) - - -!!! Abstract "" - 对于知识库文件的分段,目前 MaxKB 支持智能分段以及高级分段两种方式。 - - **智能分段** - - (1)MarkDown 类型文件智能分段规则
- - * 根据标题逐级下钻式分段(最多支持 6 级标题),每个段落最多 4096 个字符; - * 当最后一级的文本段落字符数超过设置的分段长度时,会查找分段长度以内的回车进行截取。 - - (2)HTML、DOCX 类型智能分段规则 - - * 识别标题格式转换成 markdown 的标题样式; - * 逐级下钻进行分段(最多支持 6 级标题),每个段落最多 4096 个字符。 - - (3)TXT和 PDF 类型文件智能分段规则 - - * 按照标题# 进行分段,若没有#标题的则按照字符数4096个字符进行分段; - * 查找分段长度以内的回车进行截取。 - -![智能分段](<../../img/dataset/automatic_paragraphing.png>) - -!!! Abstract "" - 文档规范建议: - - * **分段标识规范**:离线文档的分段标识要有一定规范,否则拆分出来的段落不规整。 - * **段落完整**:在一个分段中集中描述一个完整的内容。 - -!!! Abstract "" - **高级分段** - - 用户可以根据文档规范自定义设置分段标识符、分段长度及自动清洗。 - - * 分段标识支持:#、##、###、####、#####、######、-、空行、回车、空格、分号、逗号、句号,并支持手动输入其它分段标识符或正则表达式。 - * 分段长度:单个分段的长度,范围 50 至 4096 个字符。 - * 自动清洗:开启后系统会自动去掉重复多余的符号如空格、空行、制表符等。 - -![高级分段](<../../img/dataset/advanced_segmentation.png>) -!!! Abstract "" - **导入时添加分段标题为关联问题** - - 勾选后会把所有分段的标题设置为分段的关联问题。 -![设置标题为关联问题](../../img/dataset/titel_set_question.png) - - -!!! Abstract "" - **预览** - - 分段规则设置完成后,需要点击【生成预览】才能查看最新规则的分段效果。 -![分段预览](<../../img/dataset/preview_segmentation.png>) -!!! Abstract "" - 在分段预览中对不合理的分段进行再次编辑以及删除无意义分段。 -![编辑分段](../../img/dataset/view_edit.png) - - -!!! Abstract "" - 点击【开始导入】后,系统后台会对文档进行自动分段 -> 存储 -> 向量化操作,处理结束后,文件状态将显示为完成。 -![编辑分段](../../img/dataset/processing.png) - - -### 1.2 Web站点知识库 - -!!! Abstract "" - 输入知识库名称、知识库描述,选择向量模型并设置知识库类型为 Web 站点。 - -![Web知识库](../../img/dataset/web_dataset.png) - -!!! Abstract "" - * Web 根地址:为在线静态网页站点的根节点地址,系统会自动获取 Web 根地址及子级地址的数据资料。以DataEase V2在线文档为例,可在 Web 根地址为:https://dataease.io/docs/v2/ 。 - * 选择器:针对 Web 页面的数据可以设置定获取某个div内的数据,默认获取 body 数据。如 DataEase 在线文档仅获取中间内容部分,可以右键检查网页,定位到中间内部区域找到 div 为 md-content,则选择器输入为:.md-content 。 - -![Alt text](../../img/dataset/DataEase_doc.png) -!!! Abstract "" - 点击【创建并导入】后,跳转到文档列表页面查看当前 Web 站点下文档的详细信息,处理结束后,文件状态将显示为完成。 - -![Alt text](../../img/dataset/web_doc.png) - -## 2 知识库操作 - -!!! Abstract "" - MaxKB 知识库支持同步、重新向量化、设置、导出以及删除操作。 - -![知识库导出](../../img/dataset/dataset_actions.png) - -### 2.1 同步 Web 知识库 - -!!! Abstract "" - 对于 Web 站点类型知识库,在知识库卡片网格中,点击知识库面板的【…】->【同步】,对知识库中所有内容进行同步。 - - * 同步替换:重新获取 Web 站点文档,覆盖替换本地知识库中的文档。 - * 整体同步:先删除本地知识库的所有文档,重新获取 Web 站点文档。 -![知识库导出](../../img/dataset/web_ sync.png) - -### 2.2 重新向量化 - -!!! Abstract "" - 如果在知识库设置中选择了不同的向量模型,对于新增的文档将使用新设置的向量模型进行向量化,如果要对已有的知识库进行重新向量化,可在知识库卡片网格中,点击知识库面板的【…】->【重新向量化】,对知识库中已有的分段进行重新向量化。 - -![知识库导出](../../img/dataset/dataset_embedding.png) - -### 2.3 设置知识库 - -!!! Abstract "" - 在知识库列表,点击知识库面板的【…】->【设置】进入知识库设置页面,可以对当前知识库名称、描述、向量模型等属性进行修改,所有设置保存后设置生效。 -![知识库设置页面](../../img/dataset/dataset_setting.png) - -### 2.4 导出知识库 - -!!! Abstract "" - 在知识库列表,点击知识库面板的【…】->【导出EXCEL】/【导出ZIP】。将知识库的分段内容以Excel或ZIP文件格式导出。 - 每个文档为 Excel 文件的一个 sheet,sheet 每一行展示一个分段。导出 ZIP 文件时,会将引用的图片一起导出,且以 guid 的方式进行命名,且没有格式扩展名。 - -![知识库导出](../../img/dataset/dataset_export.png) -![知识库导出](../../img/dataset/dataset_zip.png){ width="500px" } - -### 2.5 删除知识库 - -!!! Abstract "" - 在知识库列表,点击知识库面板的【…】->【删除】对知识库进行删除操作。 - 在知识库卡片网格中,点击知识库面板的【…】->【删除】,对知识库进行删除操作。 - - **注意**:知识库删除后无法恢复,请谨慎操作。 -![知识库删除](../../img/dataset/dataset_del.png) - diff --git a/docs/user_manual/dataset/doclist.md b/docs/user_manual/dataset/doclist.md deleted file mode 100644 index b520c837..00000000 --- a/docs/user_manual/dataset/doclist.md +++ /dev/null @@ -1,118 +0,0 @@ -# 文档 - -## 1 文档上传 - -!!! Abstract "" - 对于通用型知识库,点击【上传文档】进入上传文档页面,可以拖拽文件或选择文件/文件夹进行上传,支持的文件格式包括:TXT、Markdown、PDF、DOCX、HTML、XLS、XLSX、CSV、ZIP。如果选择文件夹,将通过文件后缀进行自动过滤,每次最多上传 50 个文件,且单个文件不超过 100 MB。 - -![上传文档](../../img/dataset/create_offline_dataset.png) - -!!! Abstract "" - 点击【下一步】,对上传文档选择分段规则,默认为智能分段。分段规则变更后需点击【生成预览】,确认分段效果,然后点击【开始导入】,系统将对文档按照自动分段 -> 存储 -> 向量化流程处理。 - -![智能分段](<../../img/dataset/auto_paragraph.png>) - -!!! Abstract "" - 对于 Web 站点知识库,点击【导入文档】打开对话框,输入文档链接 URL 地址和选择器,即可同步对应内容。 - -![导入Web文档](../../img/dataset/upload_web_doc.png) - -## 2 同步知识库 - -!!! Abstract "" - Web 站点知识库支持同步更新操作,同步方式分为替换同步和完全同步。 - - * 替换同步:重新获取 Web 站点文档,替换本地知识库中地址相同的文档。 - * 整体同步:先删除本地知识库中所有文档,重新获取 Web站点下的文档数据。 - -![同步知识库](../../img/dataset/sysn_dataset.png) - - -## 3 文档同步 - -!!! Abstract "" - Web 站点知识库支持对选中文档进行同步操作。同步时会先删除当前文档下的所有分段,并重新获取文档地址的文本数据后重新分段。 - -![同步文档](../../img/dataset/sysn_web_doc.png) - - -## 4 命中处理设置 - -!!! Abstract "" - 文档设置目前支持文档的命中处理方式。 - - * 模型优化:提问时命中该文档下面的分段后,会按照应用的提示词生成 prompt 发送给模型优化后返回答案。 - * 直接回答:提问时命中该文档下面的分段后,若相似度符合设置则直接返回分段内容。对于需要将图片、链接等信息返回要求,建议使用此方式。 - - -![文档设置](../../img/dataset/doc_setting.png) - -## 5 生成问题 - -!!! Abstract "" - 选中文件,点击【生成问题】按钮或执行生成问题操作,将通过 AI 模型,根据文件内容总结生成对应的问题,并自动关联。 - -![生成问题](../../img/dataset/gen_question.png) - -## 6 文档迁移 - -!!! Abstract "" - 选中文档,点击【迁移】按钮,将文档迁移到其它知识库。 - -![迁移文档](../../img/dataset/move_web_doc.png) - -## 7 导出EXCEL/ZIP - -!!! Abstract "" - 选中文档,执行导出Excel/导出Zip操作,将文档下载到本地客户端。 - -![文档导出](../../img/dataset/dataset_file_export.png) - -## 8 文档删除 - -!!! Abstract "" - 选中文档,点击删除按钮或执行删除操作,对选中文档进行删除。 - -![文档删除](../../img/dataset/doc_delete.png) - -## 9 文档启用与禁用 - -!!! Abstract "" - 在文档列表中的其中状态列,可对文档执行启用或禁用操作。文档禁用后,当用户提问时系统不会检索该文档下的分段内容,需要重新启用后系统才会检索。 - -![文档启用](../../img/dataset/doc_enable.png) - -## 10 分段管理 - -!!! Abstract "" - 导入文档后,系统根据分段规则进行分段操作。点击文档列表中的文档,进入文档分段管理页面,可添加、编辑、迁移、删除、启用/禁用分段以及为分段添加关联问题。 - -![分段管理](<../../img/dataset/segmentation_management.png>) - -### 10.1 添加分段 - -!!! Abstract "" - 点击【添加分段】,弹出添加分段对话框,填写分段标题、分段内容(支持 markdown 样式编辑分段内容)和关联问题,点击【提交】后则新增一个分段。 - **建议:** 为了能准确匹配到分段,建议为分段设置关联问题,这样会优先匹配关联问题,然后再映射分段内容,从而提高匹配效率和准确度。 - -![添加分段](../../img/dataset/add_segmentation.png) - -### 10.2 编辑分段 - -!!! Abstract "" - 点击分段面板,在分段详情页面对已分段的信息进行编辑和关联问题操作。 -![分段详情](../../img/dataset/edit_segmentation.png) - -### 10.3 迁移分段 - -!!! Abstract "" - 在分段面板中可以对选中分段迁移到其它知识库的文档中。 - -![迁移分段](../../img/dataset/move_segmentation.png) - -### 10.4 删除分段 - -!!! Abstract "" - 在分段面板中可以对选中分段进行删除。 - -![删除分段](../../img/dataset/del_segmentation.png) diff --git a/docs/user_manual/dataset/hit-testing.md b/docs/user_manual/dataset/hit-testing.md deleted file mode 100644 index 9838a574..00000000 --- a/docs/user_manual/dataset/hit-testing.md +++ /dev/null @@ -1,21 +0,0 @@ -# 命中测试 - -!!! Abstract "" - 知识库命中测试是对提问进行提前验证,点击【命中测试】,输入测试问题,系统在当前知识库中向量检索与问题相关的分段,然后按照相似度和返回Top 分段数等参数返回命中结果,可以根据命中测试返回分段内容,对分段进行再次编辑或添加关联问题,以进一步提升和优化回答效果。 -![命中测试](../../img/dataset/hittesting.png) - - -!!! Abstract "" - **参数设置说明** - - * **检索模式**:当前支持向量检索、全文检索和混合检索 3 种检索模式。
- (1)向量检索:使用向量模型通过向量距离计算与用户问题最相似的文本分段。 - (2)全文检索:通过关键词检索,返回包含关键词最多的文本分段。 - (3)混合检索:同时执行全文检索和向量检索,再进行重排序,从两类查询结果中选择匹配用户问题的最佳结果。 - * **相似度**:相似度越高代表问题和分段的相关性越强。 - * **返回分段数 TOP** : 返回符合条件的 Top N 个分段。 - - - - - diff --git a/docs/user_manual/dataset/problem.md b/docs/user_manual/dataset/problem.md deleted file mode 100644 index 0b17a0ff..00000000 --- a/docs/user_manual/dataset/problem.md +++ /dev/null @@ -1,24 +0,0 @@ -# 问题 - -!!! Abstract "" - MaxKB 知识库管理员可以收集用户可能提出的相关问题,创建问题并关联知识库文档中的内容,维护知识库常见问题列表,以提高问答的准确度。 -![问题列表](../../img/dataset/problem_list.png) - -## 1 创建问题 - -!!! Abstract "" - 点击【创建问题】,分行输入问题列表。 -![创建问题](../../img/dataset/create_problem.png) - -## 2 问题关联分段 - -!!! Abstract "" - 问题添加完成后,可以与文档中的分段进行关联,当用户提问时会优先匹配问题库来查询相关的分段。 -![问题关联分段](../../img/dataset/problem_segmentation.png) - -## 3 问题详情 - -!!! Abstract "" - 点击问题查看详情,可对分段内容进行修改或取消关联关系。 - -![问题详情](../../img/dataset/problem_detail.png) \ No newline at end of file diff --git a/docs/user_manual/fx/fx.md b/docs/user_manual/fx/fx.md deleted file mode 100644 index b3669f76..00000000 --- a/docs/user_manual/fx/fx.md +++ /dev/null @@ -1,71 +0,0 @@ -# 函数库 - -!!! Abstract "" - MaxKB 知识库问答系统支持了函数库功能。用户可以根据自身的业务需求,在函数库中创建特定的函数脚本,例如数据处理、逻辑判断、信息提取或其它任何满足实际工作场景的操作。 - 函数创建完成后,在应用编排时以添加组件的方式调用这些函数,从而更好地满足各种复杂的业务需求。这种组件化的设计不仅提高了工作效率,还使得整个系统更加模块化,便于维护和扩展。 - - -## 1.函数依赖包安装 - -!!! Abstract "" - 如果函数实现需要安装第三方依赖包,可在 maxkb 容器中使用 pip 命令进行安装。 - - ``` - # 进入 maxkb 容器中 - docker exec -it maxkb bash - - # pip安装第三方依赖,如 pymysql,执行下面命令 - pip install pymysql - ``` - - -## 2.创建函数 - - -!!! Abstract "" - 点击【创建函数】,打开创建函数对话框。 - - - 函数名称:函数的调用标识,创建成功后显示在高级编排应用的组件列表中。 - - 描述:函数详细说明以及使用注意事项,会显示在高级编排应用的组件列表中。 - - 输入变量:函数的输入变量,变量的数据类别包括:string、int、float、array,来源分为自定义赋值和引用前置节点的变量值。 - 在高级编排应用配置函数节点对应的输入变量。 - - Python 代码:自定义编写 Python 函数代码,可以引用输入变量。 - - 输出变量:Python 代码执行返回的结果。 - -![创建函数](../../img/fx/add_fx.png) - -!!! Abstract "" - Python 代码编写完成后,点击【调试】进行代码功能的验证。调试完成后,点击【创建】,即完成函数的创建。 -![函数调试](../../img/fx/fx_debug.png) - -!!! Abstract "" - 创建成功的函数,可以在【高级编排应用】的设置中,点击【添加组件】->【函数库】中,以添加组件的方式调用这些函数。 - -![添加函数节点](../../img/fx/use_fx.png) - -## 3.函数导出/导入 - -!!! Abstract "" - 函数支持导出和导入,对应的文件后缀为 `.fx`。 - -![函数导入导出](../../img/fx/import_export_dx.png) - - -## 4.复制函数 - -!!! Abstract "" - 点击函数面板的【复制】按钮,打开复制函数对话框,对原函数内容进行编辑修改后点击【创建】即可快速创建一个新函数。 - -![复制函数](../../img/fx/copy_fx.png) - -## 5.删除函数 - -!!! Abstract "" - 点击函数面板的【删除】按钮,即可对函数进行删除。 - -![删除函数](../../img/fx/del_fx.png) -!!! Abstract "" - - **注意:** 函数删除后,如果应用引用了该函数,那么在编排页面将显示`该函数不可用`的提示信息,并且在问答时也会报错。 - -![应用引用已删除函数](../../img/fx/use_del_fx.png) diff --git a/docs/user_manual/model/X-Infer_model.md b/docs/user_manual/model/X-Infer_model.md deleted file mode 100644 index 15bd8a31..00000000 --- a/docs/user_manual/model/X-Infer_model.md +++ /dev/null @@ -1,45 +0,0 @@ -## 1 添加模型 - -!!! Abstract "" - 选择模型供应商为`Xorbits Inference`,并在模型添加对话框中输入如下必要信息: - - * 模型名称:MaxKB 中自定义的模型名称。 - * 权限:分为私有和公用两种权限,私有模型仅当前用户可用,公用模型即系统内所有用户均可使用,但其它用户不能编辑和删除。 - * 模型类型:大语言模型/向量模型/重排模型/语音识别/语音合成/视觉模型/图片生成。 - * 基础模型:不同类型模型下的基础模型名称,下拉选项是常用的一些基础模型名称,支持自定义输入。 - -!!! Abstract "" - 大语言模型和重排模型需要输入 API 域名和API Key,向量模型需要输入API 域名。 - - * API 域名:Xorbits Inference 服务地址,例如:http://192.168.20.242:9997 。 - * API Key:若没有 API Key,输入任意字符即可。 - -## 2 配置样例 - -!!! Abstract "" - Xorbits Inference-大语言模型配置样例图示如下: -![Xorbits Inference](../../img/model/xinfo_llm.png){ width="500px" } - -!!! Abstract "" - Xorbits Inference-向量模型配置样例图示如下: -![Xorbits Inference](../../img/model/xinfo_embed.png){ width="500px" } - -!!! Abstract "" - Xorbits Inference-重排模型配置样例图示如下: -![Xorbits Inference](../../img/model/xinfo_reranker.png){ width="500px" } - -!!! Abstract "" - Xorbits Inference-语音识别模型配置样例图示如下: -![Xorbits Inference](../../img/model/xinfo_asr.png){ width="500px" } - -!!! Abstract "" - Xorbits Inference-语音合成模型配置样例图示如下: -![Xorbits Inference](../../img/model/xinfo_tts.png){ width="500px" } - -!!! Abstract "" - Xorbits Inference-视觉模型配置样例图示如下: -![Xorbits Inference](../../img/model/xinfo_version.png){ width="500px" } - -!!! Abstract "" - Xorbits Inference-图片生成模型配置样例图示如下: -![Xorbits Inference](../../img/model/xinfo_version_gen.png){ width="500px" } diff --git a/docs/user_manual/model/amazon_bedrock_model.md b/docs/user_manual/model/amazon_bedrock_model.md deleted file mode 100644 index 72d121f5..00000000 --- a/docs/user_manual/model/amazon_bedrock_model.md +++ /dev/null @@ -1,23 +0,0 @@ -## 1 添加模型 - -!!! Abstract "" - 选择模型供应商为`Amazon Bedrock`,并在模型添加对话框中输入如下必要信息: - - * 模型名称:MaxKB 中自定义的模型名称。 - * 权限:分为私有和公用两种权限,私有模型仅当前用户可用,公用模型即系统内所有用户均可使用,但其它用户不能编辑和删除。 - * 模型类型:大语言模型/向量大模型。 - * 基础模型:Amazon Bedrock 支持的 LLM 模型名称,下拉选项是常用的一些大语言模型名称,支持自定义输入。 - * Region Name:模型开通的区域。 - * Access Key ID/Secret Access Key: Access Key ID 和 Secret Access Key 是用于对 AWS 服务(包括 Amazon Bedrock)的编程访问进行身份验证的凭证。 - -## 2 配置样例 - -!!! Abstract "" - Amazon Bedrock-大语言模型配置样例图示: - -![AWS LLM模型](../../img/model/AWS_LLM.png){ width="500px" } - -!!! Abstract "" - Amazon Bedrock-向量模型配置样例图示: - -![AWS LLM模型](../../img/model/aws_embed.png){ width="500px" } \ No newline at end of file diff --git a/docs/user_manual/model/anthropic_model.md b/docs/user_manual/model/anthropic_model.md deleted file mode 100644 index e4016b36..00000000 --- a/docs/user_manual/model/anthropic_model.md +++ /dev/null @@ -1,27 +0,0 @@ -## 1 添加模型 - -!!! Abstract "" - 添加 Anthropic 模型之前,需要注册并在控制台中的【账户管理-API密钥】中创建 API Key。 -![SILICONFLOW](../../img/model/siliconflow_model.png) - -!!! Abstract "" - 选择模型供应商为`Anthropic`,并在模型添加对话框中输入如下必要信息: - - * 模型名称:MaxKB 中自定义的模型名称。 - * 权限:分为私有和公用两种权限,私有模型仅当前用户可用,公用模型即系统内所有用户均可使用,但其它用户不能编辑和删除。 - * 模型类型:大语言模型/视觉模型。 - * 基础模型:Anthropic 支持的各类模型的基础模型名称,选项中显示了 Anthropic 支持的部分常用大语言模型名称,支持手动输入,但需要与 Anthropic 支持的模型名称保持一致,否则无法通过校验。 - * API URL:https://api.anthropic.com/v1/messages - * API Key:在 anthropic 控制台创建的 API Key。 - -## 2 配置样例 - -!!! Abstract "" - Anthropic-大语言模型配置样例图示如下: - -![anthropic](../../img/model/anthropic_llm.png){ width="500px" } - -!!! Abstract "" - Anthropic-视觉模型配置样例图示如下: - -![anthropic](../../img/model/anthropic_version.png){ width="500px" } diff --git a/docs/user_manual/model/azure_openai_model.md b/docs/user_manual/model/azure_openai_model.md deleted file mode 100644 index 47fbc190..00000000 --- a/docs/user_manual/model/azure_openai_model.md +++ /dev/null @@ -1,26 +0,0 @@ -## 1 添加模型 - -!!! Abstract "" - 添加 Azure OpenAI 大模型之前,需要先在 [Azure AI Studio](https://ai.azure.com/) 中注册,并获取有关API 域名、API Key、部署详细信息等内容,参考下图: - -![Azure OpenAI Key](<../../img/model/Azure_APIKey.png>) -![Azure OpenAI DemployInfo](<../../img/model/Azure_deployInfo.png>) - -!!! Abstract "" - 选择模型供应商为`Azure OpenAI`,并在模型添加对话框中输入如下必要信息: - - * 模型名称:MaxKB 中自定义的模型名称。 - * 权限:分为私有和公用两种权限,私有模型仅当前用户可用,公用模型即系统内所有用户均可使用,但其它用户不能编辑和删除。 - * 模型类型:大语言模型/向量模型/语音识别/语音合成/视觉模型/图片生成。 - * 基础模型:具体的基础模型由部署名决定,见上图。 - * API 版本:模型版本 - * API 域名:Azure OpenAI 项目 API 服务 URL,见上图。 - * API Key:Azure OpenAI 项目 API 服务认证验证信息,见上图。 - * 部署名:Azure AI Studio 项目操场中模型的部署名称。 - -## 2 配置样例 - -!!! Abstract "" - Azure OpenAI-大语言模型配置样例图示: - -![Azure_大语言模型](../../img/model/azure_model.png) \ No newline at end of file diff --git a/docs/user_manual/model/bailian_model.md b/docs/user_manual/model/bailian_model.md deleted file mode 100644 index f280cd07..00000000 --- a/docs/user_manual/model/bailian_model.md +++ /dev/null @@ -1,51 +0,0 @@ -## 1 添加模型 - -!!! Abstract "" - 选择模型供应商为`阿里云百炼`,并在模型添加对话框中输入如下必要信息: - - * 模型名称:MaxKB 中自定义的模型名称。 - * 权限:分为私有和公用两种权限,私有模型仅当前用户可用,公用模型即系统内所有用户均可使用,但其它用户不能编辑和删除。 - * 模型类型:大语言模型/向量模型/重排模型/语音识别/语音合成/视觉模型/图片生成。 - * 基础模型:不同类型模型下的基础模型名称,下拉选项是常用的一些基础模型名称,支持自定义输入。 - * API 域名:模型服务 API 服务访问地址,目前当模型类型是大语言模型时需要输入。 - * API Key:模型服务 API 服务访问密钥。 - -![阿里云百炼 APIKEY](../../img/model/aliyun_bailian_apikey.png) - -## 2 配置样例 - -!!! Abstract "" - 阿里云百炼-大语言模型配置样例图示如下,需要说明的是:不同的大语言模型对应的 API 域名不一样,具体请查看对应基础模型的 API调用示例。 - -![阿里云百炼 大语言模型配置](../../img/model/bailian_llm.png){ width="500px" } - - -!!! Abstract "" - 阿里云百炼-向量模型配置样例图示如下: - -![阿里云百炼 向量模型配置](../../img/model/bailian_embed.png){ width="500px" } - -!!! Abstract "" - 阿里云百炼-重排模型配置样例图示如下: -![阿里云百炼 重排模型配置](../../img/model/bailian_reranker.png){ width="500px" } - -!!! Abstract "" - 阿里云百炼-语音识别模型配置样例图示如下: -![阿里云百炼 语音识别模型配置](../../img/model/bailian_asr.png){ width="500px" } - -!!! Abstract "" - 阿里云百炼-语音合成模型配置样例图示如下: -![阿里云百炼 语音合成模型配置](../../img/model/bailian_tts.png){ width="500px" } - -!!! Abstract "" - 阿里云百炼-视觉模型模型配置样例图示如下: -![阿里云百炼 视觉模型模型配置](../../img/model/bailian_vision.png){ width="500px" } - -!!! Abstract "" - 阿里云百炼-图片生成模型默认图像尺寸为 1024 * 1024,图片数量 1 张,风格为 ,即由模型随机输出图像风格,配置样例图示如下: -![阿里云百炼 图片生成模型配置](../../img/model/bailian_vision_gen1.png){ width="500px" } - -![阿里云百炼 图片生成模型配置](../../img/model/bailian_vision_gen2.png){ width="500px" } - - - diff --git a/docs/user_manual/model/deepseek_model.md b/docs/user_manual/model/deepseek_model.md deleted file mode 100644 index 6edb4c5b..00000000 --- a/docs/user_manual/model/deepseek_model.md +++ /dev/null @@ -1,21 +0,0 @@ -## 1 添加模型 - -!!! Abstract "" - 添加 DeepSeek 大模型之前,需要先在 [DeepSeek 开放平台](https://platform.deepseek.com/) 创建 API Key。 -![kimi 模型](../../img/model/deepseek_apikey.png) - -!!! Abstract "" - 选择模型供应商为`DeepSeek`,并在模型添加对话框中输入如下必要信息: - - * 模型名称:MaxKB 中自定义的模型名称。 - * 权限:分为私有和公用两种权限,私有模型仅当前用户可用,公用模型即系统内所有用户均可使用,但其它用户不能编辑和删除。 - * 模型类型:大语言模型。 - * 基础模型:不同类型模型下的基础模型名称,下拉选项是常用的一些基础模型名称,支持自定义输入。 - * API Key:在 DeepSeek 开放平台创建并查看。 - -## 2 配置样例 - -!!! Abstract "" - DeepSeek-大语言模型配置样例图示: - -![deepseek 模型](../../img/model/deepseek_llm.png){ width="500px" } \ No newline at end of file diff --git a/docs/user_manual/model/doubao_model.md b/docs/user_manual/model/doubao_model.md deleted file mode 100644 index 60cb60a6..00000000 --- a/docs/user_manual/model/doubao_model.md +++ /dev/null @@ -1,59 +0,0 @@ -## 1 添加模型 - -!!! Abstract "" - 选择模型供应商为`火山引擎`,并在模型添加对话框中输入如下必要信息: - - * 模型名称:MaxKB 中自定义的模型名称。 - * 权限:分为私有和公用两种权限,私有模型仅当前用户可用,公用模型即系统内所有用户均可使用,但其它用户不能编辑和删除。 - * 模型类型:大语言模型/向量模型/语音识别/语音合成/视觉模型/图片生成。 - -!!! Abstract "" - 豆包大语言模型其它接入参数说明: - - * 基础模型:在线推理的接入点ID。 - * API 域名:https://ark.cn-beijing.volces.com/api/v3 - * API Key:接入点-> API调用 -> 通过API Key授权 -> 选择 API Key 复制获取,如下图 - -![火山引擎 LLM模型](../../img/model/doubao_jieru.png) -![火山引擎 LLM模型](../../img/model/doubao_llm_apikey.png) - - -!!! Abstract "" - 语音识别和语音合成需要输入App ID、Access Token、Cluster ID。 - - * App 域名:语音识别模型 API 域名为`wss://openspeech.bytedance.com/api/v2/asr`,语音合成模型 API 域名为`wss://openspeech.bytedance.com/api/v1/tts/ws_binary` - * App ID:在火山引擎中创建的应用ID。 - * Access Token:在火山引擎应用对应的认证信息。 - * Cluster ID:在火山引擎应用对应的服务信息. - -![火山引擎_语音识别](../../img/model/doubao_stt.png) -![火山引擎o_语音合成](../../img/model/doubao_tts.png) - -## 2 配置样例 - -!!! Abstract "" - 火山引擎-大语言模型配置样例图示如下: -![火山引擎 LLM模型](../../img/model/huoshan_llm.png){ width="500px" } - -!!! Abstract "" - 火山引擎-向量模型配置样例图示如下: -![火山引擎 向量模型](../../img/model/huoshan_embedding.png){ width="500px" } - -!!! Abstract "" - 火山引擎-语音识别模型配置样例图示如下: -![火山引擎 语音识别模型](../../img/model/huoshan_asr.png){ width="500px" } - -!!! Abstract "" - 火山引擎-语音合成模型配置样例图示如下: -![火山引擎 语音合成模型](../../img/model/huoshan_tts.png){ width="500px" } - -!!! Abstract "" - 火山引擎-视觉模型模型配置样例图示如下: -![火山引擎 视觉模型](../../img/model/doubao_vision.png){ width="500px" } - -!!! Abstract "" - 火山引擎-图片生成模型需要在火山引擎【控制台-访问控制-API访问密钥】新建密钥,样例图示如下: -![火山引擎 图片生成](../../img/model/doubao_gen1.png){ width="500px" } - -![火山引擎 图片生成](../../img/model/doubao_gen2.png){ width="500px" } - diff --git a/docs/user_manual/model/gemini_model.md b/docs/user_manual/model/gemini_model.md deleted file mode 100644 index 421d0d0e..00000000 --- a/docs/user_manual/model/gemini_model.md +++ /dev/null @@ -1,23 +0,0 @@ -## 1 添加模型 - -!!! Abstract "" - 添加 Gemini 大模型之前,需要先在 [Google AI Studio](https://aistudio.google.com/) 创建 API Key。 -![Gemini APIKEy](../../img/model/gemini_key.png) - -!!! Abstract "" - 选择模型供应商为`Gemini`,并在模型添加对话框中输入如下必要信息: - - * 模型名称:MaxKB 中自定义的模型名称。 - * 权限:分为私有和公用两种权限,私有模型仅当前用户可用,公用模型即系统内所有用户均可使用,但其它用户不能编辑和删除。 - * 模型类型:大语言模型/向量模型/语音识别/视觉模型。 - * 基础模型:不同类型模型下的基础模型名称,下拉选项是常用的一些基础模型名称,支持自定义输入。 - * API Key:获取 API Key。 - - **注意:** 使用 Gemini API 需要确保程序所在服务器位于 [Gemini API 所支持的地区](https://ai.google.dev/gemini-api/docs/available-regions?hl=zh-cn) ,否则无法调用API,并且无法进入Google AI Studio。 - -## 2 配置样例 - -!!! Abstract "" - Gemini-大语言模型配置样例图示: - -![gemini 大语言模型](../../img/model/gemini_llm.png){ width="500px" } \ No newline at end of file diff --git a/docs/user_manual/model/hunyuan_model.md b/docs/user_manual/model/hunyuan_model.md deleted file mode 100644 index 7f7686fc..00000000 --- a/docs/user_manual/model/hunyuan_model.md +++ /dev/null @@ -1,38 +0,0 @@ -## 1 添加模型 - -!!! Abstract "" - 添加腾讯混元大模型之前,需要先在腾讯云开通腾讯混元服务并新建秘钥。 - -![tencent apikey](../../img/model/tencent_apikey.png) - -!!! Abstract "" - 选择模型供应商为`腾讯混元`,并在模型添加对话框中输入如下必要信息: - - * 模型名称:MaxKB 中自定义的模型名称。 - * 权限:分为私有和公用两种权限,私有模型仅当前用户可用,公用模型即系统内所有用户均可使用,但其它用户不能编辑和删除。 - * 模型类型:大语言模型/向量模型/视觉模型/图片生成。 - * 基础模型:不同类型模型下的基础模型名称,下拉选项是常用的一些基础模型名称,支持自定义输入。 - * APPID:【腾讯云-控制台-访问管理-API密钥管理】中获取。 - * SecretId:【腾讯云-控制台-访问管理-API密钥管理】中获取。 - * SecretKey:【腾讯云-控制台-访问管理-API密钥管理】新建密钥时下载的SecretKey。 - -## 2 配置样例 - -!!! Abstract "" - 腾讯混元-大语言模型配置样例图示如下: - -![hunyuan 大语言模型](../../img/model/hunyuan_LLM.png){ width="500px" } - -!!! Abstract "" - 腾讯混元-向量模型配置样例图示如下: -![hunyuan 向量模型](../../img/model/hunyuan_embed.png){ width="500px" } - -!!! Abstract "" - 腾讯混元-视觉模型模型配置样例图示如下: -![hunyuan 视觉模型模型](../../img/model/hunyuan_vision.png){ width="500px" } - -!!! Abstract "" - 腾讯混元-图片生成模型默认图像尺寸为 768 * 768,图片数量 1 张,风格为201,即日系动漫风格,默认配置样例图示如下: -![hunyuan 图片生成模型](../../img/model/hunyuan_vision_gen1.png){ width="500px" } - -![hunyuan 图片生成模型](../../img/model/hunyuan_vision_gen2.png){ width="500px" } diff --git a/docs/user_manual/model/kimi_model.md b/docs/user_manual/model/kimi_model.md deleted file mode 100644 index 749a32df..00000000 --- a/docs/user_manual/model/kimi_model.md +++ /dev/null @@ -1,23 +0,0 @@ -## 1 添加模型 - -!!! Abstract "" - 添加 kimi 模型之前,需要先在 [Moonshot AI 开放平台](https://platform.moonshot.cn/console/account) 中注册并创建 API Key。 - -![kimi APIkey](../../img/model/kimi_apikey.png) - -!!! Abstract "" - 选择模型供应商为`Kimi`,并在模型添加对话框中输入如下必要信息: - - * 模型名称:MaxKB 中自定义的模型名称。 - * 权限:分为私有和公用两种权限,私有模型仅当前用户可用,公用模型即系统内所有用户均可使用,但其它用户不能编辑和删除。 - * 模型类型:大语言模型。 - * 基础模型:不同类型模型下的基础模型名称,下拉选项是常用的一些基础模型名称,支持自定义输入。。 - * API 域名:https://api.moonshot.cn/v1 - * API Key:在 Kimi 账户中心的 API Key 管理中创建和查看。 - -## 2 配置样例 - -!!! Abstract "" - kimi-大语言模型配置样例图示: - -![kimi 模型](../../img/model/kimi_llm.png){ width="500px" } \ No newline at end of file diff --git a/docs/user_manual/model/local_model.md b/docs/user_manual/model/local_model.md deleted file mode 100644 index 72c30e8f..00000000 --- a/docs/user_manual/model/local_model.md +++ /dev/null @@ -1,36 +0,0 @@ -## 1 下载模型 - -!!! Abstract "" - **前提条件:** 将模型下载到服务器,并且挂在到 MaxKB 容器中,以向量模型为例详细说明如下。 - - (1)将向量模型下载到本地服务器。 - ``` - # 推荐模型下载网址 - https://huggingface.co/models?other=text-embedding - # 下载后存放在/opt/maxkb/model/local_embedding目录下 - ``` - (2)使用-v 将宿主机模型路径挂载到 MaxKB 容器内部。 - ``` - -v /opt/maxkb/model/local_embedding:/opt/maxkb/model/local_embedding - # 说明: v 模型所在目录:MaxKB容器内目录 - ``` -## 2 添加模型 - -!!! Abstract "" - 在模型管理中,点击供应商【本地模型】,直接进入下一步填写本地模型的表单。 - - * 模型名称:MaxKB 中自定义的模型名称。 - * 权限:分为私有和公用两种权限,私有模型仅当前用户可用,公用模型即系统内所有用户均可使用,但其它用户不能编辑和删除。 - * 模型类型:向量模型/重排模型。 - * 基础模型:模型在 MaxKB 容器下的绝对路径。 - * 模型目录:模型的目录(基础模型为名称时,该目录生效,基础模型若有绝对路径,则该参数不生效,建议与基础模型填写一致)。 - -## 3 配置样例 - -!!! Abstract "" - 本地模型-向量模型配置样例图示如下: -![本地向量模型](../../img/model/local_embed.png){ width="500px" } - -!!! Abstract "" - 本地模型-重排模型配置样例图示如下: -![本地重排模型](../../img/model/local_reranker.png){ width="500px" } \ No newline at end of file diff --git a/docs/user_manual/model/model_ summary.md b/docs/user_manual/model/model_ summary.md deleted file mode 100644 index 188dd20c..00000000 --- a/docs/user_manual/model/model_ summary.md +++ /dev/null @@ -1,32 +0,0 @@ -!!! Abstract "" - 模型管理用于对接供应商的大语言模型,支持对接主流的大模型,包括本地私有大模型(Llama 3 / Qwen 2 等)、国内公共大模型( DeepSeek / SILICONFLOW / Kimi / 通义千问 / 智谱 AI / 百度千帆 等)和国外公共大模型(OpenAI / Azure OpenAI / Anthropic / Gemini 等),支持的类型包括文本生成、向量模型、重排、语音识别、语音合成、视觉模型、图片生成等。 - - 各供应商支持的类型详情见下表(按字母排序): - - | | 大语言模型 | 向量模型 | 重排模型 | 语音识别 | 语音合成 | 视觉模型 | 图片生成 | - |-----------------|:--------:|:---------:|:----------:|:----------:|:----------:|:----------:|:----------:| - |阿里云百炼 | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | - |Anthropic | ✔ | | | | | ✔ | | - |Amazon Bedrock | ✔ | ✔ | | | | | | - |Azure OpenAI | ✔ | ✔ | | ✔ | ✔ | ✔ | ✔ | - |DeepSeek | ✔ | | | | | | | - |Gemini | ✔ | ✔ | | ✔ | | ✔ | | - |kimi | ✔ | | | | | | | - |OpenAI | ✔ | ✔ | | ✔ | ✔ | ✔ | ✔ | - |通义千问 | ✔ | | | | | ✔ | ✔ | - |SILICONFLOW | ✔ | ✔ | ✔ | ✔ | | | ✔ | - |腾讯云 | ✔ | | | | | | | - |腾讯混元 | ✔ | ✔ | | | | ✔ | ✔ | - |火山引擎 | ✔ | | | ✔ | ✔ | ✔ | ✔ | - |千帆大模型 | ✔ | ✔ | | | | | | - |讯飞星火 | ✔ | ✔ | | ✔ | ✔ | | | - |智谱 AI | ✔ | | | | | ✔ | ✔ | - |本地模型 | | ✔ | ✔ | | | | | - |Ollama | ✔ | ✔ | ✔ | | | ✔ | | - |vLLM | ✔ | | | | | | | - |Xorbits Inference| ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | - - -!!! Abstract "" - 登录 MaxKB 系统后,可以先对接模型,也可以在创建应用时再添加模型。添加模型时,可先点击【添加模型】,然后选择供应商,也可以左侧先选择供应商,然后点击【添加模型】。 - diff --git a/docs/user_manual/model/model_param.md b/docs/user_manual/model/model_param.md deleted file mode 100644 index 4005de66..00000000 --- a/docs/user_manual/model/model_param.md +++ /dev/null @@ -1,22 +0,0 @@ - -!!! Abstract "" - 点击模型右上角更多菜单,点击【模型参数设置】,可以根据各平台提供的其它参数进行配置。 - -![模型参数设置](../../img/model/model_para_setting.png) -![添加模型参数](../../img/model/model_add_para.png) - -!!! Abstract "" - 以模型联网搜索参数为例,首先需要先在对应模型平台官方 API 文档找到模型的参数信息,例如百度千帆大模型的 ERNIE-4.0-8K, 联网参数为:disable_search,打开 ERNIE-4.0-8K的模型参数设置,添加关闭实时搜索参数。 - **注意:** 不同模型该参数会有差异,请根据官方文档进行配置相关参数。 - -![千帆_实时搜索](../../img/model/qianfan_disable_search.png) - -![模型参数_实时搜索](../../img/model/model_param_search.png) - -!!! Abstract "" - 然后在应用的AI模型参数设置中,设置实时搜索功能参数。 - -![模型参数_实时搜索](../../img/model/app_model_param.png) - - - diff --git a/docs/user_manual/model/ollama_model.md b/docs/user_manual/model/ollama_model.md deleted file mode 100644 index 8a1dd1b3..00000000 --- a/docs/user_manual/model/ollama_model.md +++ /dev/null @@ -1,42 +0,0 @@ -## 1 添加模型 - -!!! Abstract "" - **说明:** Ollama允许用户在本地计算机上运行和部署大型语言模型。在添加 Ollama 模型之前需要先自行安装部署 Ollama 并运行模型,详情见:[Ollama 离线部署LLM模型](../../faq/Offline_install_OllamaModel.md)。 - -!!! Abstract "" - 模型供应商为`Ollama`,并在模型添加对话框中输入如下必要信息: - - * 模型名称:MaxKB 中自定义的模型名称。 - * 权限:分为私有和公用两种权限,私有模型仅当前用户可用,公用模型即系统内所有用户均可使用,但其它用户不能编辑和删除。 - * 模型类型:大语言模型/向量模型/视觉模型/重排模型。 - * 基础模型:不同类型模型下的基础模型名称,下拉选项是常用的一些基础模型名称,支持自定义输入,但需要与 Ollama 支持的模型名称保持一致,否则无法通过校验。如果本地没有此模型,系统将自动下载。 - -!!! Abstract "" - 大语言模型还需要输入 API 域名和API Key,向量模型需要输入API 域名。 - - * API 域名:为 Ollama 服务地址连接信息,例如:http://42.92.198.53:11434 。 - * API Key:若没有配置API Key,可以输入任意字符。 - - 点击【添加】,校验通过则添加成功,便可以在应用的 AI 模型列表选择该模型。 - -## 2 配置样例 - -!!! Abstract "" - ollama-大语言模型配置样例图示: - -![ollama 大语言模型](../../img/model/ollama_model.png) - -!!! Abstract "" - ollama-向量模型配置样例图示: - -![ollama 向量模型](../../img/model/ollama_embedding_model.png) - -!!! Abstract "" - ollama-视觉模型配置样例图示: - -![ollama 视觉模型模型](../../img/model/ollama_vision.png) - -!!! Abstract "" - ollama-重排模型配置样例图示: - -![ollama 重排模型模型](../../img/model/ollama_reranker.png) \ No newline at end of file diff --git a/docs/user_manual/model/openai_model.md b/docs/user_manual/model/openai_model.md deleted file mode 100644 index a2b6f362..00000000 --- a/docs/user_manual/model/openai_model.md +++ /dev/null @@ -1,40 +0,0 @@ -## 1 添加模型 - -!!! Abstract "" - 选择模型供应商为`OpenAI`,并在模型添加对话框中输入如下必要信息: - - * 模型名称: MaxKB 中自定义的模型名称。 - * 权限:分为私有和公用两种权限,私有模型仅当前用户可用,公用模型即系统内所有用户均可使用,但其它用户不能编辑和删除。 - * 模型类型: 大语言模型/向量模型/语音识别/语音合成/视觉模型/图片生成。 - * 基础模型: 不同类型模型下的基础模型名称,下拉选项是常用的一些基础模型名称,支持自定义输入,但需要与 OpenAI 支持的模型名称保持一致,否则无法通过校验。 - * API 域名:国外 Open API的域名是`https://api.openai.com/v1`,国内代理的API域名格式一般是`反向代理地址/v1`。 - * API Key:访问 OpenAI 的 Key。 - -## 2 配置样例 - -!!! Abstract "" - OpenAI-大语言模型配置样例图示: -![OpenAI 模型](../../img/model/openai_llm.png){ width="500px" } - - -!!! Abstract "" - OpenAI-向量模型配置样例图示: -![OpenAI 模型](../../img/model/openai_embed.png){ width="500px" } - - -!!! Abstract "" - OpenAI-语音识别模型配置样例图示: -![OpenAI 模型](../../img/model/openai_asr.png){ width="500px" } - - -!!! Abstract "" - OpenAI-语音合成配置样例图示: -![OpenAI 模型](../../img/model/openai_tts.png){ width="500px" } - -!!! Abstract "" - OpenAI-视觉模型配置样例图示: -![OpenAI 模型](../../img/model/openai_vision.png){ width="500px" } - -!!! Abstract "" - OpenAI-图片生成模型配置样例图示: -![OpenAI 模型](../../img/model/openai_verison_gen.png){ width="500px" } \ No newline at end of file diff --git a/docs/user_manual/model/qianfan_model.md b/docs/user_manual/model/qianfan_model.md deleted file mode 100644 index 16e42037..00000000 --- a/docs/user_manual/model/qianfan_model.md +++ /dev/null @@ -1,26 +0,0 @@ -## 1 添加模型 - -!!! Abstract "" - 添加千帆大模型之前,需要先在 [百度智能云千帆大模型平台](https://qianfan.cloud.baidu.com/) 中进行注册并登录。在控制台中的【模型服务-应用接入】中创建应用后,将自动生成 API Key和Secret Key 等信息。 -![百度应用](../../img/model/qianfan_app.png) - -!!! Abstract "" - 选择模型供应商为`千帆大模型`,并在模型添加对话框中输入如下必要信息: - - * 模型名称:MaxKB 中自定义的模型名称。 - * 权限:分为私有和公用两种权限,私有模型仅当前用户可用,公用模型即系统内所有用户均可使用,但其它用户不能编辑和删除。 - * 模型类型:大语言模型/向量模型。 - * 基础模型:百度千帆支持的 LLM 模型名称,选项中显示了百度千帆支持的部分常用大语言模型名称,支持手动输入,但需要与千帆大平台支持的模型名称保持一致,否则无法通过校验。 - * API Key 和 Secret Key:千帆大模型中应用的API Key 和 Secret Key。 - -## 2 配置样例 - -!!! Abstract "" - 千帆大模型-大语言模型配置样例图示: - -![千帆大模型](../../img/model/qianfan_model.png) - -!!! Abstract "" - 千帆大模型-向量模型配置样例图示: -![千帆大模型](../../img/model/qianfan_embedding.png) - diff --git a/docs/user_manual/model/siliconflow_model.md b/docs/user_manual/model/siliconflow_model.md deleted file mode 100644 index d5b2fd6b..00000000 --- a/docs/user_manual/model/siliconflow_model.md +++ /dev/null @@ -1,38 +0,0 @@ -## 1 添加模型 - -!!! Abstract "" - 添加 SILICONFLOW 模型之前,需要先在 [SILICONFLOW](https://siliconflow.cn/) 中进行注册并登录。在控制台中的【账户管理-API密钥】中新建 API 密钥。 -![SILICONFLOW](../../img/model/siliconflow_model.png) - -!!! Abstract "" - 选择模型供应商为`SILICONFLOW`,并在模型添加对话框中输入如下必要信息: - - * 模型名称:MaxKB 中自定义的模型名称。 - * 权限:分为私有和公用两种权限,私有模型仅当前用户可用,公用模型即系统内所有用户均可使用,但其它用户不能编辑和删除。 - * 模型类型:大语言模型/向量模型/语音识别/图片生成/重排模型。 - * 基础模型:SILICONFLOW 支持的各类模型的基础模型名称,选项中显示了 SILICONFLOW 支持的部分常用大语言模型名称,支持手动输入,但需要与SILICONFLOW支持的模型名称保持一致,否则无法通过校验。 - * API URL:https://api.siliconflow.cn/v1 - * API Key:创建的密钥Key。 - -## 2 配置样例 - -!!! Abstract "" - SILICONFLOW-大语言模型配置样例图示如下: - -![SILICONFLOW](../../img/model/siliconflow_llm.png){ width="500px" } - -!!! Abstract "" - SILICONFLOW-向量模型配置样例图示如下: -![SILICONFLOW](../../img/model/siliconflow_embedding.png){ width="500px" } - -!!! Abstract "" - SILICONFLOW-语音识别配置样例图示如下: -![SILICONFLOW](../../img/model/siliconflow_asr.png){ width="500px" } - -!!! Abstract "" - SILICONFLOW-图片生成配置样例图示如下: -![SILICONFLOW](../../img/model/siliconflow_vision_gen.png){ width="500px" } - -!!! Abstract "" - SILICONFLOW-重排模型配置样例图示如下: -![SILICONFLOW](../../img/model/siliconflow_rerank.png){ width="500px" } diff --git a/docs/user_manual/model/spark_model.md b/docs/user_manual/model/spark_model.md deleted file mode 100644 index cb3c79af..00000000 --- a/docs/user_manual/model/spark_model.md +++ /dev/null @@ -1,48 +0,0 @@ -## 1 添加模型 - -!!! Abstract "" - 添加讯飞星火大模型之前,需要先在 [讯飞开放平台](https://www.xfyun.cn/) 中进行注册,并根据不同的模型类型创建不同应用,平台将自动生成APPID、API Secret、APIKey等信息。 - -![讯飞APP](../../img/model/xunfei_app.png) -![讯飞APP](../../img/model/xunfei_s2t_app.png) -![讯飞APP](../../img/model/xunfei_t2s_app.png) - - -!!! Abstract "" - 选择模型供应商为`讯飞星火`,并在模型添加对话框中输入如下必要信息: - - * 模型名称:MaxKB 中自定义的模型名称。 - * 权限:分为私有和公用两种权限,私有模型仅当前用户可用,公用模型即系统内所有用户均可使用,但其它用户不能编辑和删除。 - * 模型类型:大语言模型/向量模型/语音识别/语音合成。 - * 基础模型:对应接口文档中的 domain,下拉选项是讯飞星火不同模型类型下的常用基础模型名称,支持自定义输入。 - * API 域名:每个基础模型对应的 API 域名不同,请根据所选基础模型输入对应的 API 域名,详情请参考[讯飞开放平台文档中心](https://www.xfyun.cn/doc/),如下图所示。 - * APP ID:讯飞开放平台中创建应用的标识。 - * API Key:讯飞开放平台应用访问对应的 API Key。 - * API Secret:讯飞开放平台应用访问对应的的 API Secret。 - - -![讯飞星火认知大模型 API](../../img/model/xunfei_api.png) -![讯飞语音识别大模型 API](../../img/model/xunfei_tts_wss.png) -![讯飞语音合成大模型 API](../../img/model/xunfei_iat_wss.png) - -## 2 配置样例 - -!!! Abstract "" - 讯飞星火-大语言模型配置样例图示: - -![讯飞模型](../../img/model/xunfei_llm.png){ width="500px" } - -!!! Abstract "" - 讯飞星火-向量模型配置样例图示: - -![讯飞模型](../../img/model/xunfei_embed.png){ width="500px" } - -!!! Abstract "" - 讯飞星火-语音识别模型配置样例图示: - -![讯飞模型](../../img/model/xunfei_iat.png){ width="500px" } - -!!! Abstract "" - 讯飞星火-语音合成模型配置样例图示: - -![讯飞模型](../../img/model/xunfei_tts.png){ width="500px" } \ No newline at end of file diff --git a/docs/user_manual/model/tencentcloud_model.md b/docs/user_manual/model/tencentcloud_model.md deleted file mode 100644 index 81330599..00000000 --- a/docs/user_manual/model/tencentcloud_model.md +++ /dev/null @@ -1,22 +0,0 @@ -## 1 添加模型 - -!!! Abstract "" - 添加腾讯知识引擎原子能力之前,需要先在腾讯云开通知识引擎原子能力服务并新建API Key。 - -![tencent apikey](../../img/model/tencent_atomicpower_apikey.png) - -!!! Abstract "" - 选择模型供应商为`腾讯云`,并在模型添加对话框中输入如下必要信息: - - * 模型名称:MaxKB 中自定义的模型名称。 - * 权限:分为私有和公用两种权限,私有模型仅当前用户可用,公用模型即系统内所有用户均可使用,但其它用户不能编辑和删除。 - * 模型类型:大语言模型。 - * 基础模型:不同类型模型下的基础模型名称,下拉选项是常用的一些基础模型名称,支持自定义输入。 - * API URL:https://api.lkeap.cloud.tencent.com/v1/chat/completions。 - * API Key:在控制台新建的OpenAI API KEY。 - -## 2 配置样例 - -!!! Abstract "" - 腾讯云知识引擎原子能力-大语言模型配置样例图示如下: -![知识引擎原子 大语言模型](../../img/model/tencent_atomicpower_llm.png){ width="500px" } \ No newline at end of file diff --git a/docs/user_manual/model/tongyi_model.md b/docs/user_manual/model/tongyi_model.md deleted file mode 100644 index 78895caf..00000000 --- a/docs/user_manual/model/tongyi_model.md +++ /dev/null @@ -1,31 +0,0 @@ -## 1 添加模型 - -!!! Abstract "" - 添加通义千问模型之前,需要先在阿里云 DashScope 模型服务灵积的控制台中创建 API-Key。 - -![通义千问 APIkey](../../img/model/tongyi_apikey.png) - -!!! Abstract "" - 选择模型供应商为`通义千问`,并在模型添加对话框中输入如下必要信息: - - * 模型名称:MaxKB 中自定义的模型名称。 - * 权限:分为私有和公用两种权限,私有模型仅当前用户可用,公用模型即系统内所有用户均可使用,但其它用户不能编辑和删除。 - * 模型类型:大语言模型/视觉模型/图片生成。 - * 基础模型:不同类型模型下支持的基础模型名称,下拉选项是常用的一些基础模型名称,支持自定义输入。 - * API Key:阿里云 DashScope灵积模型服务 API Key管理中创建和查看。 - -## 2 配置样例 - -!!! Abstract "" - 通义千问-大语言模型配置样例图示如下: -![通义千问 大语言模型](../../img/model/tongyi_llm.png){ width="500px" } - -!!! Abstract "" - 通义千问-视觉模型模型配置样例图示如下: -![通义千问 图片模型](../../img/model/tongyi_vision.png){ width="500px" } - -!!! Abstract "" - 通义千问-图片生成模型默认图像尺寸为 1024 * 1024,图片数量 1 张,风格为 ,即由模型随机输出图像风格,配置样例图示如下: -![通义千问 图片模型](../../img/model/tongyi_vision_gen1.png){ width="500px" } - -![通义千问 图片模型](../../img/model/tongyi_vision_gen2.png){ width="500px" } diff --git a/docs/user_manual/model/vllm_model.md b/docs/user_manual/model/vllm_model.md deleted file mode 100644 index eb686b84..00000000 --- a/docs/user_manual/model/vllm_model.md +++ /dev/null @@ -1,28 +0,0 @@ -## 1 添加模型 - -!!! Abstract "" - 选择模型供应商为`vLLM`,并在模型添加对话框中输入如下必要信息: - - * 模型名称:MaxKB 中自定义的模型名称。 - * 权限:分为私有和公用两种权限,私有模型仅当前用户可用,公用模型即系统内所有用户均可使用,但其它用户不能编辑和删除。 - * 模型类型:大语言模型/向量模型/视觉模型。 - * 基础模型:不同类型模型下的基础模型名称,下拉选项是常用的一些基础模型名称,支持自定义输入。 - * API 域名:vLLM 服务地址, 如:http://192.168.20.242:8000/v1 。 - * API Key:若没有 API Key,输入任意字符即可。 - -## 2 配置样例 - -!!! Abstract "" - vLLM-大语言模型配置样例图示如下: - -![vLLM LLM模型](../../img/model/vLLM_llm.png){ width="500px" } - -!!! Abstract "" - vLLM-向量模型配置样例图示如下: - -![vLLM LLM模型](../../img/model/vllm_embedding.png){ width="500px" } - -!!! Abstract "" - vLLM-视觉模型配置样例图示如下: - -![vLLM 视觉模型](../../img/model/vllm_version_gen.png){ width="500px" } \ No newline at end of file diff --git a/docs/user_manual/model/zhipu_model.md b/docs/user_manual/model/zhipu_model.md deleted file mode 100644 index 74e170d4..00000000 --- a/docs/user_manual/model/zhipu_model.md +++ /dev/null @@ -1,34 +0,0 @@ -## 1 添加模型 - -!!! Abstract "" - 添加讯智谱AI模型之前,需要先在 [智谱AI开放平台](https://open.bigmodel.cn/) 中进行注册并创建 API Key。 - -![智普APIkey](../../img/model/zhipu_apikey.png) - -!!! Abstract "" - 选择模型供应商为`智谱AI`,并在模型添加对话框中输入如下必要信息: - - * 模型名称:MaxKB 中自定义的模型名称。 - * 权限:分为私有和公用两种权限,私有模型仅当前用户可用,公用模型即系统内所有用户均可使用,但其它用户不能编辑和删除。 - * 模型类型:大语言模型/视觉模型/图片生成。 - * 基础模型:不同类型模型下的基础模型名称,下拉选项是常用的一些基础模型名称,支持自定义输入。 - * API Key:在智谱 AI 开放平台创建的 API Key。 - -## 2 配置样例 - -!!! Abstract "" - 智谱AI-大语言模型配置样例图示如下: - -![智普_大语言模型](../../img/model/zhipu_llm.png){ width="500px" } - -!!! Abstract "" - 智谱AI-视觉模型模型配置样例图示如下: - -![智普_视觉模型模型](../../img/model/zhipu_vision.png){ width="500px" } - -!!! Abstract "" - 智谱AI-图片生成模型配置样例图示如下: - -![智普_图片生成模型](../../img/model/zhipu_vision_gen1.png){ width="500px" } - -![智普_图片生成模型](../../img/model/zhipu_vision_gen2.png){ width="500px" } \ No newline at end of file diff --git a/docs/user_manual/team/team.md b/docs/user_manual/team/team.md deleted file mode 100644 index 2eb6da4f..00000000 --- a/docs/user_manual/team/team.md +++ /dev/null @@ -1,34 +0,0 @@ -# 团队管理 - -!!! Abstract "" - 在 MaxKB 中,支持团队协同维护知识库和应用。内置所有者和成员两种角色,知识库/应用创建者即为所有者角色,添加的成员用户都是成员角色。所有者可以添加和移除成员。 - **友情提示:社区版限制 1 个团队成员。** - -![成员列表](../../img/team/teamlist.png) - -## 1 添加成员 - -!!! Abstract "" - 点击【添加成员】,需要输入完整的成员用户名或邮箱后进行添加。 - **注意:** 待添加的成员必须是已存在的用户。 - -![添加成员](../../img/team/addMembers.png) - -## 2 权限设置 - -!!! Abstract "" - 添加成员后,可以对成员分配知识库和应用的的权限。 - - * 管理权限,当成员登录 MaxKB 后可以管理操作相应资源。 - * 使用权限,当成员登录 MaxKB 后仅能查看相应资源。 - - 点击【保存】后,权限设置生效。 - -![权限设置](<../../img/team/permission_setting.png>) - -## 3 移除成员 - -!!! Abstract "" - 在成员列表中点击【…】->【移除】即可删除该成员,成员移除后将失去所有权限。 - -![移除成员](../../img/team/del_member.png) \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..01b7851f --- /dev/null +++ b/index.html @@ -0,0 +1,16 @@ + + + + + Redirecting + + + + + Redirecting to v2/... + + diff --git a/mkdocs.yml b/mkdocs.yml deleted file mode 100644 index 0f72bfaf..00000000 --- a/mkdocs.yml +++ /dev/null @@ -1,167 +0,0 @@ -site_name: 'MaxKB 文档' -site_url: 'https://maxkb.cn/' -site_description: 'MaxKB 是一款基于大语言模型和 RAG 的智能知识库问答系统' -site_author: 'MaxKB 开源项目组' -repo_name: 'MaxKB' -repo_url: 'https://github.com/1Panel-dev/MaxKB' - -edit_uri: https://github.com/1Panel-dev/MaxKB-docs/edit/main/docs/ -theme: - name: 'material' - logo: 'img/logo-white.png' - favicon: 'img/facio.ico' - language: 'zh' - highlightjs: true - hljs_languages: - - yaml - - django - palette: - - scheme: default - accent: blue - toggle: - icon: material/weather-sunny - name: Switch to dark mode - - scheme: slate - accent: blue - toggle: - icon: material/weather-night - name: Switch to light mode - features: - - navigation.instant - - navigation.tracking - - navigation.indexes - - navigation.top - - search.suggest - - search.highlight - - search.share - - header.autohide - - content.tabs.link - custom_dir: "theme" -nav: - - 产品介绍: index.md - - 系统架构: system_arch.md - - 安装部署: - - 离线安装: installation/offline_installtion.md - - 在线安装: installation/online_installtion.md - - 1Panel 安装: installation/1panel_installtion.md - - 阿里云安装: installation/aliyun.md - - 腾讯云安装: installation/tencent.md - - 命令行工具: installation/cli.md - - 快速入门: quick_start.md - - 功能手册: - - 知识库: - - 知识库: user_manual/dataset/dataset.md - - 文档: user_manual/dataset/doclist.md - - 问题: user_manual/dataset/problem.md - - 命中测试: user_manual/dataset/hit-testing.md - - 函数库: user_manual/fx/fx.md - - 应用: - - 应用创建: - - 简单配置应用: user_manual/app/simple_app.md - - 高级编排应用: user_manual/app/workflow_app.md - - 导出与导入: user_manual/app/serialization.md - - 应用概览: user_manual/app/app-view.md - - 命中测试: user_manual/app/hit-testing.md - - 对话日志: user_manual/app/log.md - - 模型管理: - - 模型概况: user_manual/model/model_ summary.md - - 模型对接: - - 对接阿里云百炼: user_manual/model/bailian_model.md - - 对接Anthropic: user_manual/model/anthropic_model.md - - 对接Amazon Bedrock: user_manual/model/amazon_bedrock_model.md - - 对接Azure OpenAI: user_manual/model/azure_openai_model.md - - 对接DeepSeek: user_manual/model/deepseek_model.md - - 对接Gemini: user_manual/model/gemini_model.md - - 对接Kimi: user_manual/model/kimi_model.md - - 对接OpenAI: user_manual/model/openai_model.md - - 对接通义千问: user_manual/model/tongyi_model.md - - 对接SILICONFLOW: user_manual/model/siliconflow_model.md - - 对接腾讯知识引擎原子能力: user_manual/model/tencentcloud_model.md - - 对接腾讯混元: user_manual/model/hunyuan_model.md - - 对接火山引擎: user_manual/model/doubao_model.md - - 对接百度千帆: user_manual/model/qianfan_model.md - - 对接讯飞星火大: user_manual/model/spark_model.md - - 对接智谱AI: user_manual/model/zhipu_model.md - - 对接本地大模型: user_manual/model/local_model.md - - 对接Ollama: user_manual/model/ollama_model.md - - 对接vLLM: user_manual/model/vllm_model.md - - 对接Xorbits Inference: user_manual/model/X-Infer_model.md - - 模型参数配置: user_manual/model/model_param.md - - 团队管理: user_manual/team/team.md - - X-Pack功能: - - 用户管理: user_manual/X-Pack/user.md - - 登录认证: user_manual/X-Pack/login_auth.md - - 应用接入: user_manual/X-Pack/app_integrate.md - - 应用显示: user_manual/X-Pack/app_logo_settting.md - - 身份验证: user_manual/X-Pack/app_auth.md - - 系统API: user_manual/X-Pack/system_API.md - - 系统外观: user_manual/X-Pack/theme_settings.md - - 开发文档: - - 开发环境搭建: dev_manual/dev_environment.md - - 通过API KEY进行对话: dev_manual/APIKey_chat.md - - 常见问题: - - Ollama离线部署LLM模型: faq/Offline_install_OllamaModel.md - - Ollama使用GPU运行LLM模型: faq/GPU_runOllama.md - - 将MaxKB小助手集成到Halo中: faq/maxkb_In_halo.md - - MaxKB和Dify有什么区别: faq/MaxKB VS.Dify.md - - 更新日志: changelog.md - - 联系我们: contact.md - -markdown_extensions: - - admonition - - codehilite: - guess_lang: True - linenums: False - - toc: - permalink: True - - footnotes - - attr_list - - def_list - - tables - - abbr - - md_in_html - - pymdownx.extra - - pymdownx.arithmatex - - pymdownx.betterem: - smart_enable: all - - pymdownx.caret - - pymdownx.critic - - pymdownx.details - - pymdownx.emoji: - emoji_generator: !!python/name:pymdownx.emoji.to_png - - pymdownx.inlinehilite - - pymdownx.magiclink - - pymdownx.mark - - pymdownx.smartsymbols - - pymdownx.superfences - - pymdownx.tasklist - - pymdownx.tilde - - pymdownx.betterem - - pymdownx.progressbar - - lightgallery - - pymdownx.tabbed - -extra_css: - - css/extra.css - -copyright: Copyright © 2014-2025 杭州飞致云信息科技有限公司, All Rights Reserved. 浙ICP备14038283号-9 - -plugins: - - search: - lang: - - en - - ja - separator: '[\s\-\.]+' -extra: - version: - method: mike - analytics: - provider: google - property: G-NG51348CBW - social: - - icon: fontawesome/brands/github - link: https://github.com/1Panel-dev/MaxKB - - icon: fontawesome/solid/envelope - link: mailto:support@fit2cloud.com - - icon: fontawesome/solid/phone - link: tel://400-052-0755 diff --git a/readthedocs.yml b/readthedocs.yml deleted file mode 100644 index de650391..00000000 --- a/readthedocs.yml +++ /dev/null @@ -1,4 +0,0 @@ -build: - image: latest - -requirements_file: requirements/requirements.txt diff --git a/requirements/requirements.txt b/requirements/requirements.txt deleted file mode 100644 index 8e3e50d0..00000000 --- a/requirements/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -mkdocs>=1.1 -mkdocs-material -mdx_gh_links -markdown>=3.2.1,<3.4 -lightgallery diff --git a/theme/f2c-header.html b/theme/f2c-header.html deleted file mode 100644 index 35243040..00000000 --- a/theme/f2c-header.html +++ /dev/null @@ -1,54 +0,0 @@ -
- - -
diff --git a/theme/main.html b/theme/main.html deleted file mode 100644 index 0252e760..00000000 --- a/theme/main.html +++ /dev/null @@ -1,56 +0,0 @@ -{% extends "base.html" %} - -{% block header %} -{% include "f2c-header.html" %} -{{ super() }} -{% endblock %} - -{% block outdated %} - You're not viewing the latest version. - - Click here to go to latest. - -{% endblock %} - -{% block styles %} - - - {{ super() }} - -{% endblock styles %} - -{% block footer %} -
- -
-{% endblock footer %} - -{% block libs %} - {{ super() }} - - - - - -{% endblock libs %} - -{% block scripts %} - {{ super() }} - -{% endblock scripts %} diff --git a/v1/404.html b/v1/404.html new file mode 100644 index 00000000..7a9174f0 --- /dev/null +++ b/v1/404.html @@ -0,0 +1,2631 @@ + + + + + + + + + + + + + + + + + + + + + + + MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ + + + + +
+ + +
+ + +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v1/assets/images/favicon.png b/v1/assets/images/favicon.png new file mode 100644 index 00000000..1cf13b9f Binary files /dev/null and b/v1/assets/images/favicon.png differ diff --git a/v1/assets/javascripts/bundle.f55a23d4.min.js b/v1/assets/javascripts/bundle.f55a23d4.min.js new file mode 100644 index 00000000..01a46ad8 --- /dev/null +++ b/v1/assets/javascripts/bundle.f55a23d4.min.js @@ -0,0 +1,16 @@ +"use strict";(()=>{var Wi=Object.create;var gr=Object.defineProperty;var Vi=Object.getOwnPropertyDescriptor;var Di=Object.getOwnPropertyNames,Vt=Object.getOwnPropertySymbols,zi=Object.getPrototypeOf,yr=Object.prototype.hasOwnProperty,ao=Object.prototype.propertyIsEnumerable;var io=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,$=(e,t)=>{for(var r in t||(t={}))yr.call(t,r)&&io(e,r,t[r]);if(Vt)for(var r of Vt(t))ao.call(t,r)&&io(e,r,t[r]);return e};var so=(e,t)=>{var r={};for(var o in e)yr.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&Vt)for(var o of Vt(e))t.indexOf(o)<0&&ao.call(e,o)&&(r[o]=e[o]);return r};var xr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Ni=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Di(t))!yr.call(e,n)&&n!==r&&gr(e,n,{get:()=>t[n],enumerable:!(o=Vi(t,n))||o.enumerable});return e};var Lt=(e,t,r)=>(r=e!=null?Wi(zi(e)):{},Ni(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var co=(e,t,r)=>new Promise((o,n)=>{var i=p=>{try{s(r.next(p))}catch(c){n(c)}},a=p=>{try{s(r.throw(p))}catch(c){n(c)}},s=p=>p.done?o(p.value):Promise.resolve(p.value).then(i,a);s((r=r.apply(e,t)).next())});var lo=xr((Er,po)=>{(function(e,t){typeof Er=="object"&&typeof po!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(Er,(function(){"use strict";function e(r){var o=!0,n=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function s(k){return!!(k&&k!==document&&k.nodeName!=="HTML"&&k.nodeName!=="BODY"&&"classList"in k&&"contains"in k.classList)}function p(k){var ft=k.type,qe=k.tagName;return!!(qe==="INPUT"&&a[ft]&&!k.readOnly||qe==="TEXTAREA"&&!k.readOnly||k.isContentEditable)}function c(k){k.classList.contains("focus-visible")||(k.classList.add("focus-visible"),k.setAttribute("data-focus-visible-added",""))}function l(k){k.hasAttribute("data-focus-visible-added")&&(k.classList.remove("focus-visible"),k.removeAttribute("data-focus-visible-added"))}function f(k){k.metaKey||k.altKey||k.ctrlKey||(s(r.activeElement)&&c(r.activeElement),o=!0)}function u(k){o=!1}function d(k){s(k.target)&&(o||p(k.target))&&c(k.target)}function y(k){s(k.target)&&(k.target.classList.contains("focus-visible")||k.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),l(k.target))}function L(k){document.visibilityState==="hidden"&&(n&&(o=!0),X())}function X(){document.addEventListener("mousemove",J),document.addEventListener("mousedown",J),document.addEventListener("mouseup",J),document.addEventListener("pointermove",J),document.addEventListener("pointerdown",J),document.addEventListener("pointerup",J),document.addEventListener("touchmove",J),document.addEventListener("touchstart",J),document.addEventListener("touchend",J)}function ee(){document.removeEventListener("mousemove",J),document.removeEventListener("mousedown",J),document.removeEventListener("mouseup",J),document.removeEventListener("pointermove",J),document.removeEventListener("pointerdown",J),document.removeEventListener("pointerup",J),document.removeEventListener("touchmove",J),document.removeEventListener("touchstart",J),document.removeEventListener("touchend",J)}function J(k){k.target.nodeName&&k.target.nodeName.toLowerCase()==="html"||(o=!1,ee())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",L,!0),X(),r.addEventListener("focus",d,!0),r.addEventListener("blur",y,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)}))});var qr=xr((dy,On)=>{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var $a=/["'&<>]/;On.exports=Pa;function Pa(e){var t=""+e,r=$a.exec(t);if(!r)return t;var o,n="",i=0,a=0;for(i=r.index;i{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof Rt=="object"&&typeof Yr=="object"?Yr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Rt=="object"?Rt.ClipboardJS=r():t.ClipboardJS=r()})(Rt,function(){return(function(){var e={686:(function(o,n,i){"use strict";i.d(n,{default:function(){return Ui}});var a=i(279),s=i.n(a),p=i(370),c=i.n(p),l=i(817),f=i.n(l);function u(D){try{return document.execCommand(D)}catch(A){return!1}}var d=function(A){var M=f()(A);return u("cut"),M},y=d;function L(D){var A=document.documentElement.getAttribute("dir")==="rtl",M=document.createElement("textarea");M.style.fontSize="12pt",M.style.border="0",M.style.padding="0",M.style.margin="0",M.style.position="absolute",M.style[A?"right":"left"]="-9999px";var F=window.pageYOffset||document.documentElement.scrollTop;return M.style.top="".concat(F,"px"),M.setAttribute("readonly",""),M.value=D,M}var X=function(A,M){var F=L(A);M.container.appendChild(F);var V=f()(F);return u("copy"),F.remove(),V},ee=function(A){var M=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},F="";return typeof A=="string"?F=X(A,M):A instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(A==null?void 0:A.type)?F=X(A.value,M):(F=f()(A),u("copy")),F},J=ee;function k(D){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?k=function(M){return typeof M}:k=function(M){return M&&typeof Symbol=="function"&&M.constructor===Symbol&&M!==Symbol.prototype?"symbol":typeof M},k(D)}var ft=function(){var A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},M=A.action,F=M===void 0?"copy":M,V=A.container,Y=A.target,$e=A.text;if(F!=="copy"&&F!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(Y!==void 0)if(Y&&k(Y)==="object"&&Y.nodeType===1){if(F==="copy"&&Y.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(F==="cut"&&(Y.hasAttribute("readonly")||Y.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if($e)return J($e,{container:V});if(Y)return F==="cut"?y(Y):J(Y,{container:V})},qe=ft;function Fe(D){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Fe=function(M){return typeof M}:Fe=function(M){return M&&typeof Symbol=="function"&&M.constructor===Symbol&&M!==Symbol.prototype?"symbol":typeof M},Fe(D)}function ki(D,A){if(!(D instanceof A))throw new TypeError("Cannot call a class as a function")}function no(D,A){for(var M=0;M0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof V.action=="function"?V.action:this.defaultAction,this.target=typeof V.target=="function"?V.target:this.defaultTarget,this.text=typeof V.text=="function"?V.text:this.defaultText,this.container=Fe(V.container)==="object"?V.container:document.body}},{key:"listenClick",value:function(V){var Y=this;this.listener=c()(V,"click",function($e){return Y.onClick($e)})}},{key:"onClick",value:function(V){var Y=V.delegateTarget||V.currentTarget,$e=this.action(Y)||"copy",Wt=qe({action:$e,container:this.container,target:this.target(Y),text:this.text(Y)});this.emit(Wt?"success":"error",{action:$e,text:Wt,trigger:Y,clearSelection:function(){Y&&Y.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(V){return vr("action",V)}},{key:"defaultTarget",value:function(V){var Y=vr("target",V);if(Y)return document.querySelector(Y)}},{key:"defaultText",value:function(V){return vr("text",V)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(V){var Y=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return J(V,Y)}},{key:"cut",value:function(V){return y(V)}},{key:"isSupported",value:function(){var V=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],Y=typeof V=="string"?[V]:V,$e=!!document.queryCommandSupported;return Y.forEach(function(Wt){$e=$e&&!!document.queryCommandSupported(Wt)}),$e}}]),M})(s()),Ui=Fi}),828:(function(o){var n=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(s,p){for(;s&&s.nodeType!==n;){if(typeof s.matches=="function"&&s.matches(p))return s;s=s.parentNode}}o.exports=a}),438:(function(o,n,i){var a=i(828);function s(l,f,u,d,y){var L=c.apply(this,arguments);return l.addEventListener(u,L,y),{destroy:function(){l.removeEventListener(u,L,y)}}}function p(l,f,u,d,y){return typeof l.addEventListener=="function"?s.apply(null,arguments):typeof u=="function"?s.bind(null,document).apply(null,arguments):(typeof l=="string"&&(l=document.querySelectorAll(l)),Array.prototype.map.call(l,function(L){return s(L,f,u,d,y)}))}function c(l,f,u,d){return function(y){y.delegateTarget=a(y.target,f),y.delegateTarget&&d.call(l,y)}}o.exports=p}),879:(function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||n.node(i[0]))},n.string=function(i){return typeof i=="string"||i instanceof String},n.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}}),370:(function(o,n,i){var a=i(879),s=i(438);function p(u,d,y){if(!u&&!d&&!y)throw new Error("Missing required arguments");if(!a.string(d))throw new TypeError("Second argument must be a String");if(!a.fn(y))throw new TypeError("Third argument must be a Function");if(a.node(u))return c(u,d,y);if(a.nodeList(u))return l(u,d,y);if(a.string(u))return f(u,d,y);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(u,d,y){return u.addEventListener(d,y),{destroy:function(){u.removeEventListener(d,y)}}}function l(u,d,y){return Array.prototype.forEach.call(u,function(L){L.addEventListener(d,y)}),{destroy:function(){Array.prototype.forEach.call(u,function(L){L.removeEventListener(d,y)})}}}function f(u,d,y){return s(document.body,u,d,y)}o.exports=p}),817:(function(o){function n(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var p=window.getSelection(),c=document.createRange();c.selectNodeContents(i),p.removeAllRanges(),p.addRange(c),a=p.toString()}return a}o.exports=n}),279:(function(o){function n(){}n.prototype={on:function(i,a,s){var p=this.e||(this.e={});return(p[i]||(p[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var p=this;function c(){p.off(i,c),a.apply(s,arguments)}return c._=a,this.on(i,c,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),p=0,c=s.length;for(p;p0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function z(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],a;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(s){a={error:s}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(a)throw a.error}}return i}function q(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o1||p(d,L)})},y&&(n[d]=y(n[d])))}function p(d,y){try{c(o[d](y))}catch(L){u(i[0][3],L)}}function c(d){d.value instanceof nt?Promise.resolve(d.value.v).then(l,f):u(i[0][2],d)}function l(d){p("next",d)}function f(d){p("throw",d)}function u(d,y){d(y),i.shift(),i.length&&p(i[0][0],i[0][1])}}function uo(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof he=="function"?he(e):e[Symbol.iterator](),r={},o("next"),o("throw"),o("return"),r[Symbol.asyncIterator]=function(){return this},r);function o(i){r[i]=e[i]&&function(a){return new Promise(function(s,p){a=e[i](a),n(s,p,a.done,a.value)})}}function n(i,a,s,p){Promise.resolve(p).then(function(c){i({value:c,done:s})},a)}}function H(e){return typeof e=="function"}function ut(e){var t=function(o){Error.call(o),o.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var zt=ut(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(o,n){return n+1+") "+o.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function Qe(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Ue=(function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var a=this._parentage;if(a)if(this._parentage=null,Array.isArray(a))try{for(var s=he(a),p=s.next();!p.done;p=s.next()){var c=p.value;c.remove(this)}}catch(L){t={error:L}}finally{try{p&&!p.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}else a.remove(this);var l=this.initialTeardown;if(H(l))try{l()}catch(L){i=L instanceof zt?L.errors:[L]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=he(f),d=u.next();!d.done;d=u.next()){var y=d.value;try{ho(y)}catch(L){i=i!=null?i:[],L instanceof zt?i=q(q([],z(i)),z(L.errors)):i.push(L)}}}catch(L){o={error:L}}finally{try{d&&!d.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new zt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)ho(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&Qe(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Qe(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=(function(){var t=new e;return t.closed=!0,t})(),e})();var Tr=Ue.EMPTY;function Nt(e){return e instanceof Ue||e&&"closed"in e&&H(e.remove)&&H(e.add)&&H(e.unsubscribe)}function ho(e){H(e)?e():e.unsubscribe()}var Pe={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var dt={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,a=n.isStopped,s=n.observers;return i||a?Tr:(this.currentObservers=null,s.push(r),new Ue(function(){o.currentObservers=null,Qe(s,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,a=o.isStopped;n?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new j;return r.source=this,r},t.create=function(r,o){return new To(r,o)},t})(j);var To=(function(e){oe(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:Tr},t})(g);var _r=(function(e){oe(t,e);function t(r){var o=e.call(this)||this;return o._value=r,o}return Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0}),t.prototype._subscribe=function(r){var o=e.prototype._subscribe.call(this,r);return!o.closed&&r.next(this._value),o},t.prototype.getValue=function(){var r=this,o=r.hasError,n=r.thrownError,i=r._value;if(o)throw n;return this._throwIfClosed(),i},t.prototype.next=function(r){e.prototype.next.call(this,this._value=r)},t})(g);var _t={now:function(){return(_t.delegate||Date).now()},delegate:void 0};var At=(function(e){oe(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=_t);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,a=o._infiniteTimeWindow,s=o._timestampProvider,p=o._windowTime;n||(i.push(r),!a&&i.push(s.now()+p)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,a=n._buffer,s=a.slice(),p=0;p0?e.prototype.schedule.call(this,r,o):(this.delay=o,this.state=r,this.scheduler.flush(this),this)},t.prototype.execute=function(r,o){return o>0||this.closed?e.prototype.execute.call(this,r,o):this._execute(r,o)},t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!=null&&n>0||n==null&&this.delay>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.flush(this),0)},t})(gt);var Lo=(function(e){oe(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t})(yt);var kr=new Lo(Oo);var Mo=(function(e){oe(t,e);function t(r,o){var n=e.call(this,r,o)||this;return n.scheduler=r,n.work=o,n}return t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!==null&&n>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=vt.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var a=r.actions;o!=null&&o===r._scheduled&&((i=a[a.length-1])===null||i===void 0?void 0:i.id)!==o&&(vt.cancelAnimationFrame(o),r._scheduled=void 0)},t})(gt);var _o=(function(e){oe(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o;r?o=r.id:(o=this._scheduled,this._scheduled=void 0);var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t})(yt);var me=new _o(Mo);var S=new j(function(e){return e.complete()});function Kt(e){return e&&H(e.schedule)}function Hr(e){return e[e.length-1]}function Xe(e){return H(Hr(e))?e.pop():void 0}function ke(e){return Kt(Hr(e))?e.pop():void 0}function Yt(e,t){return typeof Hr(e)=="number"?e.pop():t}var xt=(function(e){return e&&typeof e.length=="number"&&typeof e!="function"});function Bt(e){return H(e==null?void 0:e.then)}function Gt(e){return H(e[bt])}function Jt(e){return Symbol.asyncIterator&&H(e==null?void 0:e[Symbol.asyncIterator])}function Xt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Zi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Zt=Zi();function er(e){return H(e==null?void 0:e[Zt])}function tr(e){return fo(this,arguments,function(){var r,o,n,i;return Dt(this,function(a){switch(a.label){case 0:r=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,nt(r.read())];case 3:return o=a.sent(),n=o.value,i=o.done,i?[4,nt(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,nt(n)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function rr(e){return H(e==null?void 0:e.getReader)}function U(e){if(e instanceof j)return e;if(e!=null){if(Gt(e))return ea(e);if(xt(e))return ta(e);if(Bt(e))return ra(e);if(Jt(e))return Ao(e);if(er(e))return oa(e);if(rr(e))return na(e)}throw Xt(e)}function ea(e){return new j(function(t){var r=e[bt]();if(H(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function ta(e){return new j(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?b(function(n,i){return e(n,i,o)}):le,Te(1),r?Ve(t):Qo(function(){return new nr}))}}function jr(e){return e<=0?function(){return S}:E(function(t,r){var o=[];t.subscribe(T(r,function(n){o.push(n),e=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new g}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,a=i===void 0?!0:i,s=e.resetOnRefCountZero,p=s===void 0?!0:s;return function(c){var l,f,u,d=0,y=!1,L=!1,X=function(){f==null||f.unsubscribe(),f=void 0},ee=function(){X(),l=u=void 0,y=L=!1},J=function(){var k=l;ee(),k==null||k.unsubscribe()};return E(function(k,ft){d++,!L&&!y&&X();var qe=u=u!=null?u:r();ft.add(function(){d--,d===0&&!L&&!y&&(f=Ur(J,p))}),qe.subscribe(ft),!l&&d>0&&(l=new at({next:function(Fe){return qe.next(Fe)},error:function(Fe){L=!0,X(),f=Ur(ee,n,Fe),qe.error(Fe)},complete:function(){y=!0,X(),f=Ur(ee,a),qe.complete()}}),U(k).subscribe(l))})(c)}}function Ur(e,t){for(var r=[],o=2;oe.next(document)),e}function P(e,t=document){return Array.from(t.querySelectorAll(e))}function R(e,t=document){let r=fe(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function fe(e,t=document){return t.querySelector(e)||void 0}function Ie(){var e,t,r,o;return(o=(r=(t=(e=document.activeElement)==null?void 0:e.shadowRoot)==null?void 0:t.activeElement)!=null?r:document.activeElement)!=null?o:void 0}var wa=O(h(document.body,"focusin"),h(document.body,"focusout")).pipe(_e(1),Q(void 0),m(()=>Ie()||document.body),G(1));function et(e){return wa.pipe(m(t=>e.contains(t)),K())}function Ht(e,t){return C(()=>O(h(e,"mouseenter").pipe(m(()=>!0)),h(e,"mouseleave").pipe(m(()=>!1))).pipe(t?kt(r=>Le(+!r*t)):le,Q(e.matches(":hover"))))}function Jo(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)Jo(e,r)}function x(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)Jo(o,n);return o}function sr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function wt(e){let t=x("script",{src:e});return C(()=>(document.head.appendChild(t),O(h(t,"load"),h(t,"error").pipe(v(()=>$r(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),_(()=>document.head.removeChild(t)),Te(1))))}var Xo=new g,Ta=C(()=>typeof ResizeObserver=="undefined"?wt("https://unpkg.com/resize-observer-polyfill"):I(void 0)).pipe(m(()=>new ResizeObserver(e=>e.forEach(t=>Xo.next(t)))),v(e=>O(Ye,I(e)).pipe(_(()=>e.disconnect()))),G(1));function ce(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ge(e){let t=e;for(;t.clientWidth===0&&t.parentElement;)t=t.parentElement;return Ta.pipe(w(r=>r.observe(t)),v(r=>Xo.pipe(b(o=>o.target===t),_(()=>r.unobserve(t)))),m(()=>ce(e)),Q(ce(e)))}function Tt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function cr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}function Zo(e){let t=[],r=e.parentElement;for(;r;)(e.clientWidth>r.clientWidth||e.clientHeight>r.clientHeight)&&t.push(r),r=(e=r).parentElement;return t.length===0&&t.push(document.documentElement),t}function De(e){return{x:e.offsetLeft,y:e.offsetTop}}function en(e){let t=e.getBoundingClientRect();return{x:t.x+window.scrollX,y:t.y+window.scrollY}}function tn(e){return O(h(window,"load"),h(window,"resize")).pipe(Me(0,me),m(()=>De(e)),Q(De(e)))}function pr(e){return{x:e.scrollLeft,y:e.scrollTop}}function ze(e){return O(h(e,"scroll"),h(window,"scroll"),h(window,"resize")).pipe(Me(0,me),m(()=>pr(e)),Q(pr(e)))}var rn=new g,Sa=C(()=>I(new IntersectionObserver(e=>{for(let t of e)rn.next(t)},{threshold:0}))).pipe(v(e=>O(Ye,I(e)).pipe(_(()=>e.disconnect()))),G(1));function tt(e){return Sa.pipe(w(t=>t.observe(e)),v(t=>rn.pipe(b(({target:r})=>r===e),_(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function on(e,t=16){return ze(e).pipe(m(({y:r})=>{let o=ce(e),n=Tt(e);return r>=n.height-o.height-t}),K())}var lr={drawer:R("[data-md-toggle=drawer]"),search:R("[data-md-toggle=search]")};function nn(e){return lr[e].checked}function Je(e,t){lr[e].checked!==t&&lr[e].click()}function Ne(e){let t=lr[e];return h(t,"change").pipe(m(()=>t.checked),Q(t.checked))}function Oa(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function La(){return O(h(window,"compositionstart").pipe(m(()=>!0)),h(window,"compositionend").pipe(m(()=>!1))).pipe(Q(!1))}function an(){let e=h(window,"keydown").pipe(b(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:nn("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),b(({mode:t,type:r})=>{if(t==="global"){let o=Ie();if(typeof o!="undefined")return!Oa(o,r)}return!0}),pe());return La().pipe(v(t=>t?S:e))}function ye(){return new URL(location.href)}function lt(e,t=!1){if(B("navigation.instant")&&!t){let r=x("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function sn(){return new g}function cn(){return location.hash.slice(1)}function pn(e){let t=x("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Ma(e){return O(h(window,"hashchange"),e).pipe(m(cn),Q(cn()),b(t=>t.length>0),G(1))}function ln(e){return Ma(e).pipe(m(t=>fe(`[id="${t}"]`)),b(t=>typeof t!="undefined"))}function $t(e){let t=matchMedia(e);return ir(r=>t.addListener(()=>r(t.matches))).pipe(Q(t.matches))}function mn(){let e=matchMedia("print");return O(h(window,"beforeprint").pipe(m(()=>!0)),h(window,"afterprint").pipe(m(()=>!1))).pipe(Q(e.matches))}function zr(e,t){return e.pipe(v(r=>r?t():S))}function Nr(e,t){return new j(r=>{let o=new XMLHttpRequest;return o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network error"))}),o.addEventListener("abort",()=>{r.complete()}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{var i;if(n.lengthComputable)t.progress$.next(n.loaded/n.total*100);else{let a=(i=o.getResponseHeader("Content-Length"))!=null?i:0;t.progress$.next(n.loaded/+a*100)}}),t.progress$.next(5)),o.send(),()=>o.abort()})}function je(e,t){return Nr(e,t).pipe(v(r=>r.text()),m(r=>JSON.parse(r)),G(1))}function fn(e,t){let r=new DOMParser;return Nr(e,t).pipe(v(o=>o.text()),m(o=>r.parseFromString(o,"text/html")),G(1))}function un(e,t){let r=new DOMParser;return Nr(e,t).pipe(v(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),G(1))}function dn(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function hn(){return O(h(window,"scroll",{passive:!0}),h(window,"resize",{passive:!0})).pipe(m(dn),Q(dn()))}function bn(){return{width:innerWidth,height:innerHeight}}function vn(){return h(window,"resize",{passive:!0}).pipe(m(bn),Q(bn()))}function gn(){return N([hn(),vn()]).pipe(m(([e,t])=>({offset:e,size:t})),G(1))}function mr(e,{viewport$:t,header$:r}){let o=t.pipe(te("size")),n=N([o,r]).pipe(m(()=>De(e)));return N([r,t,n]).pipe(m(([{height:i},{offset:a,size:s},{x:p,y:c}])=>({offset:{x:a.x-p,y:a.y-c+i},size:s})))}function _a(e){return h(e,"message",t=>t.data)}function Aa(e){let t=new g;return t.subscribe(r=>e.postMessage(r)),t}function yn(e,t=new Worker(e)){let r=_a(t),o=Aa(t),n=new g;n.subscribe(o);let i=o.pipe(Z(),ie(!0));return n.pipe(Z(),Re(r.pipe(W(i))),pe())}var Ca=R("#__config"),St=JSON.parse(Ca.textContent);St.base=`${new URL(St.base,ye())}`;function xe(){return St}function B(e){return St.features.includes(e)}function Ee(e,t){return typeof t!="undefined"?St.translations[e].replace("#",t.toString()):St.translations[e]}function Se(e,t=document){return R(`[data-md-component=${e}]`,t)}function ae(e,t=document){return P(`[data-md-component=${e}]`,t)}function ka(e){let t=R(".md-typeset > :first-child",e);return h(t,"click",{once:!0}).pipe(m(()=>R(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function xn(e){if(!B("announce.dismiss")||!e.childElementCount)return S;if(!e.hidden){let t=R(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return C(()=>{let t=new g;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),ka(e).pipe(w(r=>t.next(r)),_(()=>t.complete()),m(r=>$({ref:e},r)))})}function Ha(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function En(e,t){let r=new g;return r.subscribe(({hidden:o})=>{e.hidden=o}),Ha(e,t).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))}function Pt(e,t){return t==="inline"?x("div",{class:"md-tooltip md-tooltip--inline",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"})):x("div",{class:"md-tooltip",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"}))}function wn(...e){return x("div",{class:"md-tooltip2",role:"tooltip"},x("div",{class:"md-tooltip2__inner md-typeset"},e))}function Tn(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return x("aside",{class:"md-annotation",tabIndex:0},Pt(t),x("a",{href:r,class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}else return x("aside",{class:"md-annotation",tabIndex:0},Pt(t),x("span",{class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}function Sn(e){return x("button",{class:"md-clipboard md-icon",title:Ee("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}var Ln=Lt(qr());function Qr(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(p=>!e.terms[p]).reduce((p,c)=>[...p,x("del",null,(0,Ln.default)(c))," "],[]).slice(0,-1),i=xe(),a=new URL(e.location,i.base);B("search.highlight")&&a.searchParams.set("h",Object.entries(e.terms).filter(([,p])=>p).reduce((p,[c])=>`${p} ${c}`.trim(),""));let{tags:s}=xe();return x("a",{href:`${a}`,class:"md-search-result__link",tabIndex:-1},x("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&x("div",{class:"md-search-result__icon md-icon"}),r>0&&x("h1",null,e.title),r<=0&&x("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&x("nav",{class:"md-tags"},e.tags.map(p=>{let c=s?p in s?`md-tag-icon md-tag--${s[p]}`:"md-tag-icon":"";return x("span",{class:`md-tag ${c}`},p)})),o>0&&n.length>0&&x("p",{class:"md-search-result__terms"},Ee("search.result.term.missing"),": ",...n)))}function Mn(e){let t=e[0].score,r=[...e],o=xe(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),a=r.findIndex(l=>l.scoreQr(l,1)),...p.length?[x("details",{class:"md-search-result__more"},x("summary",{tabIndex:-1},x("div",null,p.length>0&&p.length===1?Ee("search.result.more.one"):Ee("search.result.more.other",p.length))),...p.map(l=>Qr(l,1)))]:[]];return x("li",{class:"md-search-result__item"},c)}function _n(e){return x("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>x("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?sr(r):r)))}function Kr(e){let t=`tabbed-control tabbed-control--${e}`;return x("div",{class:t,hidden:!0},x("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function An(e){return x("div",{class:"md-typeset__scrollwrap"},x("div",{class:"md-typeset__table"},e))}function Ra(e){var o;let t=xe(),r=new URL(`../${e.version}/`,t.base);return x("li",{class:"md-version__item"},x("a",{href:`${r}`,class:"md-version__link"},e.title,((o=t.version)==null?void 0:o.alias)&&e.aliases.length>0&&x("span",{class:"md-version__alias"},e.aliases[0])))}function Cn(e,t){var o;let r=xe();return e=e.filter(n=>{var i;return!((i=n.properties)!=null&&i.hidden)}),x("div",{class:"md-version"},x("button",{class:"md-version__current","aria-label":Ee("select.version")},t.title,((o=r.version)==null?void 0:o.alias)&&t.aliases.length>0&&x("span",{class:"md-version__alias"},t.aliases[0])),x("ul",{class:"md-version__list"},e.map(Ra)))}var Ia=0;function ja(e){let t=N([et(e),Ht(e)]).pipe(m(([o,n])=>o||n),K()),r=C(()=>Zo(e)).pipe(ne(ze),pt(1),He(t),m(()=>en(e)));return t.pipe(Ae(o=>o),v(()=>N([t,r])),m(([o,n])=>({active:o,offset:n})),pe())}function Fa(e,t){let{content$:r,viewport$:o}=t,n=`__tooltip2_${Ia++}`;return C(()=>{let i=new g,a=new _r(!1);i.pipe(Z(),ie(!1)).subscribe(a);let s=a.pipe(kt(c=>Le(+!c*250,kr)),K(),v(c=>c?r:S),w(c=>c.id=n),pe());N([i.pipe(m(({active:c})=>c)),s.pipe(v(c=>Ht(c,250)),Q(!1))]).pipe(m(c=>c.some(l=>l))).subscribe(a);let p=a.pipe(b(c=>c),re(s,o),m(([c,l,{size:f}])=>{let u=e.getBoundingClientRect(),d=u.width/2;if(l.role==="tooltip")return{x:d,y:8+u.height};if(u.y>=f.height/2){let{height:y}=ce(l);return{x:d,y:-16-y}}else return{x:d,y:16+u.height}}));return N([s,i,p]).subscribe(([c,{offset:l},f])=>{c.style.setProperty("--md-tooltip-host-x",`${l.x}px`),c.style.setProperty("--md-tooltip-host-y",`${l.y}px`),c.style.setProperty("--md-tooltip-x",`${f.x}px`),c.style.setProperty("--md-tooltip-y",`${f.y}px`),c.classList.toggle("md-tooltip2--top",f.y<0),c.classList.toggle("md-tooltip2--bottom",f.y>=0)}),a.pipe(b(c=>c),re(s,(c,l)=>l),b(c=>c.role==="tooltip")).subscribe(c=>{let l=ce(R(":scope > *",c));c.style.setProperty("--md-tooltip-width",`${l.width}px`),c.style.setProperty("--md-tooltip-tail","0px")}),a.pipe(K(),ve(me),re(s)).subscribe(([c,l])=>{l.classList.toggle("md-tooltip2--active",c)}),N([a.pipe(b(c=>c)),s]).subscribe(([c,l])=>{l.role==="dialog"?(e.setAttribute("aria-controls",n),e.setAttribute("aria-haspopup","dialog")):e.setAttribute("aria-describedby",n)}),a.pipe(b(c=>!c)).subscribe(()=>{e.removeAttribute("aria-controls"),e.removeAttribute("aria-describedby"),e.removeAttribute("aria-haspopup")}),ja(e).pipe(w(c=>i.next(c)),_(()=>i.complete()),m(c=>$({ref:e},c)))})}function mt(e,{viewport$:t},r=document.body){return Fa(e,{content$:new j(o=>{let n=e.title,i=wn(n);return o.next(i),e.removeAttribute("title"),r.append(i),()=>{i.remove(),e.setAttribute("title",n)}}),viewport$:t})}function Ua(e,t){let r=C(()=>N([tn(e),ze(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:a,height:s}=ce(e);return{x:o-i.x+a/2,y:n-i.y+s/2}}));return et(e).pipe(v(o=>r.pipe(m(n=>({active:o,offset:n})),Te(+!o||1/0))))}function kn(e,t,{target$:r}){let[o,n]=Array.from(e.children);return C(()=>{let i=new g,a=i.pipe(Z(),ie(!0));return i.subscribe({next({offset:s}){e.style.setProperty("--md-tooltip-x",`${s.x}px`),e.style.setProperty("--md-tooltip-y",`${s.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),tt(e).pipe(W(a)).subscribe(s=>{e.toggleAttribute("data-md-visible",s)}),O(i.pipe(b(({active:s})=>s)),i.pipe(_e(250),b(({active:s})=>!s))).subscribe({next({active:s}){s?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe(Me(16,me)).subscribe(({active:s})=>{o.classList.toggle("md-tooltip--active",s)}),i.pipe(pt(125,me),b(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:s})=>s)).subscribe({next(s){s?e.style.setProperty("--md-tooltip-0",`${-s}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),h(n,"click").pipe(W(a),b(s=>!(s.metaKey||s.ctrlKey))).subscribe(s=>{s.stopPropagation(),s.preventDefault()}),h(n,"mousedown").pipe(W(a),re(i)).subscribe(([s,{active:p}])=>{var c;if(s.button!==0||s.metaKey||s.ctrlKey)s.preventDefault();else if(p){s.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(c=Ie())==null||c.blur()}}),r.pipe(W(a),b(s=>s===o),Ge(125)).subscribe(()=>e.focus()),Ua(e,t).pipe(w(s=>i.next(s)),_(()=>i.complete()),m(s=>$({ref:e},s)))})}function Wa(e){return e.tagName==="CODE"?P(".c, .c1, .cm",e):[e]}function Va(e){let t=[];for(let r of Wa(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let a;for(;a=/(\(\d+\))(!)?/.exec(i.textContent);){let[,s,p]=a;if(typeof p=="undefined"){let c=i.splitText(a.index);i=c.splitText(s.length),t.push(c)}else{i.textContent=s,t.push(i);break}}}}return t}function Hn(e,t){t.append(...Array.from(e.childNodes))}function fr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,a=new Map;for(let s of Va(t)){let[,p]=s.textContent.match(/\((\d+)\)/);fe(`:scope > li:nth-child(${p})`,e)&&(a.set(p,Tn(p,i)),s.replaceWith(a.get(p)))}return a.size===0?S:C(()=>{let s=new g,p=s.pipe(Z(),ie(!0)),c=[];for(let[l,f]of a)c.push([R(".md-typeset",f),R(`:scope > li:nth-child(${l})`,e)]);return o.pipe(W(p)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of c)l?Hn(f,u):Hn(u,f)}),O(...[...a].map(([,l])=>kn(l,t,{target$:r}))).pipe(_(()=>s.complete()),pe())})}function $n(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return $n(t)}}function Pn(e,t){return C(()=>{let r=$n(e);return typeof r!="undefined"?fr(r,e,t):S})}var Rn=Lt(Br());var Da=0;function In(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return In(t)}}function za(e){return ge(e).pipe(m(({width:t})=>({scrollable:Tt(e).width>t})),te("scrollable"))}function jn(e,t){let{matches:r}=matchMedia("(hover)"),o=C(()=>{let n=new g,i=n.pipe(jr(1));n.subscribe(({scrollable:c})=>{c&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")});let a=[];if(Rn.default.isSupported()&&(e.closest(".copy")||B("content.code.copy")&&!e.closest(".no-copy"))){let c=e.closest("pre");c.id=`__code_${Da++}`;let l=Sn(c.id);c.insertBefore(l,e),B("content.tooltips")&&a.push(mt(l,{viewport$}))}let s=e.closest(".highlight");if(s instanceof HTMLElement){let c=In(s);if(typeof c!="undefined"&&(s.classList.contains("annotate")||B("content.code.annotate"))){let l=fr(c,e,t);a.push(ge(s).pipe(W(i),m(({width:f,height:u})=>f&&u),K(),v(f=>f?l:S)))}}return P(":scope > span[id]",e).length&&e.classList.add("md-code__content"),za(e).pipe(w(c=>n.next(c)),_(()=>n.complete()),m(c=>$({ref:e},c)),Re(...a))});return B("content.lazy")?tt(e).pipe(b(n=>n),Te(1),v(()=>o)):o}function Na(e,{target$:t,print$:r}){let o=!0;return O(t.pipe(m(n=>n.closest("details:not([open])")),b(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(b(n=>n||!o),w(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function Fn(e,t){return C(()=>{let r=new g;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),Na(e,t).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))})}var Un=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.flowchartTitleText{fill:var(--md-mermaid-label-fg-color)}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel p,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel p{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color)}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}.classDiagramTitleText{fill:var(--md-mermaid-label-fg-color)}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs marker.marker.composition.class path,defs marker.marker.dependency.class path,defs marker.marker.extension.class path{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs marker.marker.aggregation.class path{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}.statediagramTitleText{fill:var(--md-mermaid-label-fg-color)}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel,.nodeLabel p{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}a .nodeLabel{text-decoration:underline}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}[id^=entity] path,[id^=entity] rect{fill:var(--md-default-bg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs .marker.oneOrMore.er *,defs .marker.onlyOne.er *,defs .marker.zeroOrMore.er *,defs .marker.zeroOrOne.er *{stroke:var(--md-mermaid-edge-color)!important}text:not([class]):last-child{fill:var(--md-mermaid-label-fg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var Gr,Qa=0;function Ka(){return typeof mermaid=="undefined"||mermaid instanceof Element?wt("https://unpkg.com/mermaid@11/dist/mermaid.min.js"):I(void 0)}function Wn(e){return e.classList.remove("mermaid"),Gr||(Gr=Ka().pipe(w(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Un,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),G(1))),Gr.subscribe(()=>co(null,null,function*(){e.classList.add("mermaid");let t=`__mermaid_${Qa++}`,r=x("div",{class:"mermaid"}),o=e.textContent,{svg:n,fn:i}=yield mermaid.render(t,o),a=r.attachShadow({mode:"closed"});a.innerHTML=n,e.replaceWith(r),i==null||i(a)})),Gr.pipe(m(()=>({ref:e})))}var Vn=x("table");function Dn(e){return e.replaceWith(Vn),Vn.replaceWith(An(e)),I({ref:e})}function Ya(e){let t=e.find(r=>r.checked)||e[0];return O(...e.map(r=>h(r,"change").pipe(m(()=>R(`label[for="${r.id}"]`))))).pipe(Q(R(`label[for="${t.id}"]`)),m(r=>({active:r})))}function zn(e,{viewport$:t,target$:r}){let o=R(".tabbed-labels",e),n=P(":scope > input",e),i=Kr("prev");e.append(i);let a=Kr("next");return e.append(a),C(()=>{let s=new g,p=s.pipe(Z(),ie(!0));N([s,ge(e),tt(e)]).pipe(W(p),Me(1,me)).subscribe({next([{active:c},l]){let f=De(c),{width:u}=ce(c);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let d=pr(o);(f.xd.x+l.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),N([ze(o),ge(o)]).pipe(W(p)).subscribe(([c,l])=>{let f=Tt(o);i.hidden=c.x<16,a.hidden=c.x>f.width-l.width-16}),O(h(i,"click").pipe(m(()=>-1)),h(a,"click").pipe(m(()=>1))).pipe(W(p)).subscribe(c=>{let{width:l}=ce(o);o.scrollBy({left:l*c,behavior:"smooth"})}),r.pipe(W(p),b(c=>n.includes(c))).subscribe(c=>c.click()),o.classList.add("tabbed-labels--linked");for(let c of n){let l=R(`label[for="${c.id}"]`);l.replaceChildren(x("a",{href:`#${l.htmlFor}`,tabIndex:-1},...Array.from(l.childNodes))),h(l.firstElementChild,"click").pipe(W(p),b(f=>!(f.metaKey||f.ctrlKey)),w(f=>{f.preventDefault(),f.stopPropagation()})).subscribe(()=>{history.replaceState({},"",`#${l.htmlFor}`),l.click()})}return B("content.tabs.link")&&s.pipe(Ce(1),re(t)).subscribe(([{active:c},{offset:l}])=>{let f=c.innerText.trim();if(c.hasAttribute("data-md-switching"))c.removeAttribute("data-md-switching");else{let u=e.offsetTop-l.y;for(let y of P("[data-tabs]"))for(let L of P(":scope > input",y)){let X=R(`label[for="${L.id}"]`);if(X!==c&&X.innerText.trim()===f){X.setAttribute("data-md-switching",""),L.click();break}}window.scrollTo({top:e.offsetTop-u});let d=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...d])])}}),s.pipe(W(p)).subscribe(()=>{for(let c of P("audio, video",e))c.offsetWidth&&c.autoplay?c.play().catch(()=>{}):c.pause()}),Ya(n).pipe(w(c=>s.next(c)),_(()=>s.complete()),m(c=>$({ref:e},c)))}).pipe(Ke(se))}function Nn(e,{viewport$:t,target$:r,print$:o}){return O(...P(".annotate:not(.highlight)",e).map(n=>Pn(n,{target$:r,print$:o})),...P("pre:not(.mermaid) > code",e).map(n=>jn(n,{target$:r,print$:o})),...P("pre.mermaid",e).map(n=>Wn(n)),...P("table:not([class])",e).map(n=>Dn(n)),...P("details",e).map(n=>Fn(n,{target$:r,print$:o})),...P("[data-tabs]",e).map(n=>zn(n,{viewport$:t,target$:r})),...P("[title]",e).filter(()=>B("content.tooltips")).map(n=>mt(n,{viewport$:t})))}function Ba(e,{alert$:t}){return t.pipe(v(r=>O(I(!0),I(!1).pipe(Ge(2e3))).pipe(m(o=>({message:r,active:o})))))}function qn(e,t){let r=R(".md-typeset",e);return C(()=>{let o=new g;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),Ba(e,t).pipe(w(n=>o.next(n)),_(()=>o.complete()),m(n=>$({ref:e},n)))})}var Ga=0;function Ja(e,t){document.body.append(e);let{width:r}=ce(e);e.style.setProperty("--md-tooltip-width",`${r}px`),e.remove();let o=cr(t),n=typeof o!="undefined"?ze(o):I({x:0,y:0}),i=O(et(t),Ht(t)).pipe(K());return N([i,n]).pipe(m(([a,s])=>{let{x:p,y:c}=De(t),l=ce(t),f=t.closest("table");return f&&t.parentElement&&(p+=f.offsetLeft+t.parentElement.offsetLeft,c+=f.offsetTop+t.parentElement.offsetTop),{active:a,offset:{x:p-s.x+l.width/2-r/2,y:c-s.y+l.height+8}}}))}function Qn(e){let t=e.title;if(!t.length)return S;let r=`__tooltip_${Ga++}`,o=Pt(r,"inline"),n=R(".md-typeset",o);return n.innerHTML=t,C(()=>{let i=new g;return i.subscribe({next({offset:a}){o.style.setProperty("--md-tooltip-x",`${a.x}px`),o.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){o.style.removeProperty("--md-tooltip-x"),o.style.removeProperty("--md-tooltip-y")}}),O(i.pipe(b(({active:a})=>a)),i.pipe(_e(250),b(({active:a})=>!a))).subscribe({next({active:a}){a?(e.insertAdjacentElement("afterend",o),e.setAttribute("aria-describedby",r),e.removeAttribute("title")):(o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t))},complete(){o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t)}}),i.pipe(Me(16,me)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe(pt(125,me),b(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?o.style.setProperty("--md-tooltip-0",`${-a}px`):o.style.removeProperty("--md-tooltip-0")},complete(){o.style.removeProperty("--md-tooltip-0")}}),Ja(o,e).pipe(w(a=>i.next(a)),_(()=>i.complete()),m(a=>$({ref:e},a)))}).pipe(Ke(se))}function Xa({viewport$:e}){if(!B("header.autohide"))return I(!1);let t=e.pipe(m(({offset:{y:n}})=>n),Be(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),K()),o=Ne("search");return N([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),K(),v(n=>n?r:I(!1)),Q(!1))}function Kn(e,t){return C(()=>N([ge(e),Xa(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),K((r,o)=>r.height===o.height&&r.hidden===o.hidden),G(1))}function Yn(e,{header$:t,main$:r}){return C(()=>{let o=new g,n=o.pipe(Z(),ie(!0));o.pipe(te("active"),He(t)).subscribe(([{active:a},{hidden:s}])=>{e.classList.toggle("md-header--shadow",a&&!s),e.hidden=s});let i=ue(P("[title]",e)).pipe(b(()=>B("content.tooltips")),ne(a=>Qn(a)));return r.subscribe(o),t.pipe(W(n),m(a=>$({ref:e},a)),Re(i.pipe(W(n))))})}function Za(e,{viewport$:t,header$:r}){return mr(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=ce(e);return{active:n>0&&o>=n}}),te("active"))}function Bn(e,t){return C(()=>{let r=new g;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=fe(".md-content h1");return typeof o=="undefined"?S:Za(o,t).pipe(w(n=>r.next(n)),_(()=>r.complete()),m(n=>$({ref:e},n)))})}function Gn(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),K()),n=o.pipe(v(()=>ge(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),te("bottom"))));return N([o,n,t]).pipe(m(([i,{top:a,bottom:s},{offset:{y:p},size:{height:c}}])=>(c=Math.max(0,c-Math.max(0,a-p,i)-Math.max(0,c+p-s)),{offset:a-i,height:c,active:a-i<=p})),K((i,a)=>i.offset===a.offset&&i.height===a.height&&i.active===a.active))}function es(e){let t=__md_get("__palette")||{index:e.findIndex(o=>matchMedia(o.getAttribute("data-md-color-media")).matches)},r=Math.max(0,Math.min(t.index,e.length-1));return I(...e).pipe(ne(o=>h(o,"change").pipe(m(()=>o))),Q(e[r]),m(o=>({index:e.indexOf(o),color:{media:o.getAttribute("data-md-color-media"),scheme:o.getAttribute("data-md-color-scheme"),primary:o.getAttribute("data-md-color-primary"),accent:o.getAttribute("data-md-color-accent")}})),G(1))}function Jn(e){let t=P("input",e),r=x("meta",{name:"theme-color"});document.head.appendChild(r);let o=x("meta",{name:"color-scheme"});document.head.appendChild(o);let n=$t("(prefers-color-scheme: light)");return C(()=>{let i=new g;return i.subscribe(a=>{if(document.body.setAttribute("data-md-color-switching",""),a.color.media==="(prefers-color-scheme)"){let s=matchMedia("(prefers-color-scheme: light)"),p=document.querySelector(s.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");a.color.scheme=p.getAttribute("data-md-color-scheme"),a.color.primary=p.getAttribute("data-md-color-primary"),a.color.accent=p.getAttribute("data-md-color-accent")}for(let[s,p]of Object.entries(a.color))document.body.setAttribute(`data-md-color-${s}`,p);for(let s=0;sa.key==="Enter"),re(i,(a,s)=>s)).subscribe(({index:a})=>{a=(a+1)%t.length,t[a].click(),t[a].focus()}),i.pipe(m(()=>{let a=Se("header"),s=window.getComputedStyle(a);return o.content=s.colorScheme,s.backgroundColor.match(/\d+/g).map(p=>(+p).toString(16).padStart(2,"0")).join("")})).subscribe(a=>r.content=`#${a}`),i.pipe(ve(se)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")}),es(t).pipe(W(n.pipe(Ce(1))),ct(),w(a=>i.next(a)),_(()=>i.complete()),m(a=>$({ref:e},a)))})}function Xn(e,{progress$:t}){return C(()=>{let r=new g;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(w(o=>r.next({value:o})),_(()=>r.complete()),m(o=>({ref:e,value:o})))})}var Jr=Lt(Br());function ts(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r.trimEnd()}function Zn({alert$:e}){Jr.default.isSupported()&&new j(t=>{new Jr.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||ts(R(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(w(t=>{t.trigger.focus()}),m(()=>Ee("clipboard.copied"))).subscribe(e)}function ei(e,t){return e.protocol=t.protocol,e.hostname=t.hostname,e}function rs(e,t){let r=new Map;for(let o of P("url",e)){let n=R("loc",o),i=[ei(new URL(n.textContent),t)];r.set(`${i[0]}`,i);for(let a of P("[rel=alternate]",o)){let s=a.getAttribute("href");s!=null&&i.push(ei(new URL(s),t))}}return r}function ur(e){return un(new URL("sitemap.xml",e)).pipe(m(t=>rs(t,new URL(e))),de(()=>I(new Map)))}function os(e,t){if(!(e.target instanceof Element))return S;let r=e.target.closest("a");if(r===null)return S;if(r.target||e.metaKey||e.ctrlKey)return S;let o=new URL(r.href);return o.search=o.hash="",t.has(`${o}`)?(e.preventDefault(),I(new URL(r.href))):S}function ti(e){let t=new Map;for(let r of P(":scope > *",e.head))t.set(r.outerHTML,r);return t}function ri(e){for(let t of P("[href], [src]",e))for(let r of["href","src"]){let o=t.getAttribute(r);if(o&&!/^(?:[a-z]+:)?\/\//i.test(o)){t[r]=t[r];break}}return I(e)}function ns(e){for(let o of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...B("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let n=fe(o),i=fe(o,e);typeof n!="undefined"&&typeof i!="undefined"&&n.replaceWith(i)}let t=ti(document);for(let[o,n]of ti(e))t.has(o)?t.delete(o):document.head.appendChild(n);for(let o of t.values()){let n=o.getAttribute("name");n!=="theme-color"&&n!=="color-scheme"&&o.remove()}let r=Se("container");return We(P("script",r)).pipe(v(o=>{let n=e.createElement("script");if(o.src){for(let i of o.getAttributeNames())n.setAttribute(i,o.getAttribute(i));return o.replaceWith(n),new j(i=>{n.onload=()=>i.complete()})}else return n.textContent=o.textContent,o.replaceWith(n),S}),Z(),ie(document))}function oi({location$:e,viewport$:t,progress$:r}){let o=xe();if(location.protocol==="file:")return S;let n=ur(o.base);I(document).subscribe(ri);let i=h(document.body,"click").pipe(He(n),v(([p,c])=>os(p,c)),pe()),a=h(window,"popstate").pipe(m(ye),pe());i.pipe(re(t)).subscribe(([p,{offset:c}])=>{history.replaceState(c,""),history.pushState(null,"",p)}),O(i,a).subscribe(e);let s=e.pipe(te("pathname"),v(p=>fn(p,{progress$:r}).pipe(de(()=>(lt(p,!0),S)))),v(ri),v(ns),pe());return O(s.pipe(re(e,(p,c)=>c)),s.pipe(v(()=>e),te("hash")),e.pipe(K((p,c)=>p.pathname===c.pathname&&p.hash===c.hash),v(()=>i),w(()=>history.back()))).subscribe(p=>{var c,l;history.state!==null||!p.hash?window.scrollTo(0,(l=(c=history.state)==null?void 0:c.y)!=null?l:0):(history.scrollRestoration="auto",pn(p.hash),history.scrollRestoration="manual")}),e.subscribe(()=>{history.scrollRestoration="manual"}),h(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),t.pipe(te("offset"),_e(100)).subscribe(({offset:p})=>{history.replaceState(p,"")}),s}var ni=Lt(qr());function ii(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,a)=>`${i}${a}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").replace(/&/g,"&").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return a=>(0,ni.default)(a).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function It(e){return e.type===1}function dr(e){return e.type===3}function ai(e,t){let r=yn(e);return O(I(location.protocol!=="file:"),Ne("search")).pipe(Ae(o=>o),v(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:B("search.suggest")}}})),r}function si(e){var l;let{selectedVersionSitemap:t,selectedVersionBaseURL:r,currentLocation:o,currentBaseURL:n}=e,i=(l=Xr(n))==null?void 0:l.pathname;if(i===void 0)return;let a=ss(o.pathname,i);if(a===void 0)return;let s=ps(t.keys());if(!t.has(s))return;let p=Xr(a,s);if(!p||!t.has(p.href))return;let c=Xr(a,r);if(c)return c.hash=o.hash,c.search=o.search,c}function Xr(e,t){try{return new URL(e,t)}catch(r){return}}function ss(e,t){if(e.startsWith(t))return e.slice(t.length)}function cs(e,t){let r=Math.min(e.length,t.length),o;for(o=0;oS)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:a,aliases:s})=>a===i||s.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),v(n=>h(document.body,"click").pipe(b(i=>!i.metaKey&&!i.ctrlKey),re(o),v(([i,a])=>{if(i.target instanceof Element){let s=i.target.closest("a");if(s&&!s.target&&n.has(s.href)){let p=s.href;return!i.target.closest(".md-version")&&n.get(p)===a?S:(i.preventDefault(),I(new URL(p)))}}return S}),v(i=>ur(i).pipe(m(a=>{var s;return(s=si({selectedVersionSitemap:a,selectedVersionBaseURL:i,currentLocation:ye(),currentBaseURL:t.base}))!=null?s:i})))))).subscribe(n=>lt(n,!0)),N([r,o]).subscribe(([n,i])=>{R(".md-header__topic").appendChild(Cn(n,i))}),e.pipe(v(()=>o)).subscribe(n=>{var s;let i=new URL(t.base),a=__md_get("__outdated",sessionStorage,i);if(a===null){a=!0;let p=((s=t.version)==null?void 0:s.default)||"latest";Array.isArray(p)||(p=[p]);e:for(let c of p)for(let l of n.aliases.concat(n.version))if(new RegExp(c,"i").test(l)){a=!1;break e}__md_set("__outdated",a,sessionStorage,i)}if(a)for(let p of ae("outdated"))p.hidden=!1})}function ls(e,{worker$:t}){let{searchParams:r}=ye();r.has("q")&&(Je("search",!0),e.value=r.get("q"),e.focus(),Ne("search").pipe(Ae(i=>!i)).subscribe(()=>{let i=ye();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=et(e),n=O(t.pipe(Ae(It)),h(e,"keyup"),o).pipe(m(()=>e.value),K());return N([n,o]).pipe(m(([i,a])=>({value:i,focus:a})),G(1))}function pi(e,{worker$:t}){let r=new g,o=r.pipe(Z(),ie(!0));N([t.pipe(Ae(It)),r],(i,a)=>a).pipe(te("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(te("focus")).subscribe(({focus:i})=>{i&&Je("search",i)}),h(e.form,"reset").pipe(W(o)).subscribe(()=>e.focus());let n=R("header [for=__search]");return h(n,"click").subscribe(()=>e.focus()),ls(e,{worker$:t}).pipe(w(i=>r.next(i)),_(()=>r.complete()),m(i=>$({ref:e},i)),G(1))}function li(e,{worker$:t,query$:r}){let o=new g,n=on(e.parentElement).pipe(b(Boolean)),i=e.parentElement,a=R(":scope > :first-child",e),s=R(":scope > :last-child",e);Ne("search").subscribe(l=>{s.setAttribute("role",l?"list":"presentation"),s.hidden=!l}),o.pipe(re(r),Wr(t.pipe(Ae(It)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:a.textContent=f.length?Ee("search.result.none"):Ee("search.result.placeholder");break;case 1:a.textContent=Ee("search.result.one");break;default:let u=sr(l.length);a.textContent=Ee("search.result.other",u)}});let p=o.pipe(w(()=>s.innerHTML=""),v(({items:l})=>O(I(...l.slice(0,10)),I(...l.slice(10)).pipe(Be(4),Dr(n),v(([f])=>f)))),m(Mn),pe());return p.subscribe(l=>s.appendChild(l)),p.pipe(ne(l=>{let f=fe("details",l);return typeof f=="undefined"?S:h(f,"toggle").pipe(W(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(b(dr),m(({data:l})=>l)).pipe(w(l=>o.next(l)),_(()=>o.complete()),m(l=>$({ref:e},l)))}function ms(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=ye();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function mi(e,t){let r=new g,o=r.pipe(Z(),ie(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),h(e,"click").pipe(W(o)).subscribe(n=>n.preventDefault()),ms(e,t).pipe(w(n=>r.next(n)),_(()=>r.complete()),m(n=>$({ref:e},n)))}function fi(e,{worker$:t,keyboard$:r}){let o=new g,n=Se("search-query"),i=O(h(n,"keydown"),h(n,"focus")).pipe(ve(se),m(()=>n.value),K());return o.pipe(He(i),m(([{suggest:s},p])=>{let c=p.split(/([\s-]+)/);if(s!=null&&s.length&&c[c.length-1]){let l=s[s.length-1];l.startsWith(c[c.length-1])&&(c[c.length-1]=l)}else c.length=0;return c})).subscribe(s=>e.innerHTML=s.join("").replace(/\s/g," ")),r.pipe(b(({mode:s})=>s==="search")).subscribe(s=>{switch(s.type){case"ArrowRight":e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText);break}}),t.pipe(b(dr),m(({data:s})=>s)).pipe(w(s=>o.next(s)),_(()=>o.complete()),m(()=>({ref:e})))}function ui(e,{index$:t,keyboard$:r}){let o=xe();try{let n=ai(o.search,t),i=Se("search-query",e),a=Se("search-result",e);h(e,"click").pipe(b(({target:p})=>p instanceof Element&&!!p.closest("a"))).subscribe(()=>Je("search",!1)),r.pipe(b(({mode:p})=>p==="search")).subscribe(p=>{let c=Ie();switch(p.type){case"Enter":if(c===i){let l=new Map;for(let f of P(":first-child [href]",a)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,d])=>d-u);f.click()}p.claim()}break;case"Escape":case"Tab":Je("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof c=="undefined")i.focus();else{let l=[i,...P(":not(details) > [href], summary, details[open] [href]",a)],f=Math.max(0,(Math.max(0,l.indexOf(c))+l.length+(p.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}p.claim();break;default:i!==Ie()&&i.focus()}}),r.pipe(b(({mode:p})=>p==="global")).subscribe(p=>{switch(p.type){case"f":case"s":case"/":i.focus(),i.select(),p.claim();break}});let s=pi(i,{worker$:n});return O(s,li(a,{worker$:n,query$:s})).pipe(Re(...ae("search-share",e).map(p=>mi(p,{query$:s})),...ae("search-suggest",e).map(p=>fi(p,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,Ye}}function di(e,{index$:t,location$:r}){return N([t,r.pipe(Q(ye()),b(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>ii(o.config)(n.searchParams.get("h"))),m(o=>{var a;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let s=i.nextNode();s;s=i.nextNode())if((a=s.parentElement)!=null&&a.offsetHeight){let p=s.textContent,c=o(p);c.length>p.length&&n.set(s,c)}for(let[s,p]of n){let{childNodes:c}=x("span",null,p);s.replaceWith(...Array.from(c))}return{ref:e,nodes:n}}))}function fs(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return N([r,t]).pipe(m(([{offset:i,height:a},{offset:{y:s}}])=>(a=a+Math.min(n,Math.max(0,s-i))-n,{height:a,locked:s>=i+n})),K((i,a)=>i.height===a.height&&i.locked===a.locked))}function Zr(e,o){var n=o,{header$:t}=n,r=so(n,["header$"]);let i=R(".md-sidebar__scrollwrap",e),{y:a}=De(i);return C(()=>{let s=new g,p=s.pipe(Z(),ie(!0)),c=s.pipe(Me(0,me));return c.pipe(re(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*a}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),c.pipe(Ae()).subscribe(()=>{for(let l of P(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=ce(f);f.scrollTo({top:u-d/2})}}}),ue(P("label[tabindex]",e)).pipe(ne(l=>h(l,"click").pipe(ve(se),m(()=>l),W(p)))).subscribe(l=>{let f=R(`[id="${l.htmlFor}"]`);R(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),fs(e,r).pipe(w(l=>s.next(l)),_(()=>s.complete()),m(l=>$({ref:e},l)))})}function hi(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return st(je(`${r}/releases/latest`).pipe(de(()=>S),m(o=>({version:o.tag_name})),Ve({})),je(r).pipe(de(()=>S),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),Ve({}))).pipe(m(([o,n])=>$($({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return je(r).pipe(m(o=>({repositories:o.public_repos})),Ve({}))}}function bi(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return st(je(`${r}/releases/permalink/latest`).pipe(de(()=>S),m(({tag_name:o})=>({version:o})),Ve({})),je(r).pipe(de(()=>S),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),Ve({}))).pipe(m(([o,n])=>$($({},o),n)))}function vi(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return hi(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return bi(r,o)}return S}var us;function ds(e){return us||(us=C(()=>{let t=__md_get("__source",sessionStorage);if(t)return I(t);if(ae("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return S}return vi(e.href).pipe(w(o=>__md_set("__source",o,sessionStorage)))}).pipe(de(()=>S),b(t=>Object.keys(t).length>0),m(t=>({facts:t})),G(1)))}function gi(e){let t=R(":scope > :last-child",e);return C(()=>{let r=new g;return r.subscribe(({facts:o})=>{t.appendChild(_n(o)),t.classList.add("md-source__repository--active")}),ds(e).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))})}function hs(e,{viewport$:t,header$:r}){return ge(document.body).pipe(v(()=>mr(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),te("hidden"))}function yi(e,t){return C(()=>{let r=new g;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(B("navigation.tabs.sticky")?I({hidden:!1}):hs(e,t)).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))})}function bs(e,{viewport$:t,header$:r}){let o=new Map,n=P(".md-nav__link",e);for(let s of n){let p=decodeURIComponent(s.hash.substring(1)),c=fe(`[id="${p}"]`);typeof c!="undefined"&&o.set(s,c)}let i=r.pipe(te("height"),m(({height:s})=>{let p=Se("main"),c=R(":scope > :first-child",p);return s+.8*(c.offsetTop-p.offsetTop)}),pe());return ge(document.body).pipe(te("height"),v(s=>C(()=>{let p=[];return I([...o].reduce((c,[l,f])=>{for(;p.length&&o.get(p[p.length-1]).tagName>=f.tagName;)p.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let d=f.offsetParent;for(;d;d=d.offsetParent)u+=d.offsetTop;return c.set([...p=[...p,l]].reverse(),u)},new Map))}).pipe(m(p=>new Map([...p].sort(([,c],[,l])=>c-l))),He(i),v(([p,c])=>t.pipe(Fr(([l,f],{offset:{y:u},size:d})=>{let y=u+d.height>=Math.floor(s.height);for(;f.length;){let[,L]=f[0];if(L-c=u&&!y)f=[l.pop(),...f];else break}return[l,f]},[[],[...p]]),K((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([s,p])=>({prev:s.map(([c])=>c),next:p.map(([c])=>c)})),Q({prev:[],next:[]}),Be(2,1),m(([s,p])=>s.prev.length{let i=new g,a=i.pipe(Z(),ie(!0));if(i.subscribe(({prev:s,next:p})=>{for(let[c]of p)c.classList.remove("md-nav__link--passed"),c.classList.remove("md-nav__link--active");for(let[c,[l]]of s.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",c===s.length-1)}),B("toc.follow")){let s=O(t.pipe(_e(1),m(()=>{})),t.pipe(_e(250),m(()=>"smooth")));i.pipe(b(({prev:p})=>p.length>0),He(o.pipe(ve(se))),re(s)).subscribe(([[{prev:p}],c])=>{let[l]=p[p.length-1];if(l.offsetHeight){let f=cr(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=ce(f);f.scrollTo({top:u-d/2,behavior:c})}}})}return B("navigation.tracking")&&t.pipe(W(a),te("offset"),_e(250),Ce(1),W(n.pipe(Ce(1))),ct({delay:250}),re(i)).subscribe(([,{prev:s}])=>{let p=ye(),c=s[s.length-1];if(c&&c.length){let[l]=c,{hash:f}=new URL(l.href);p.hash!==f&&(p.hash=f,history.replaceState({},"",`${p}`))}else p.hash="",history.replaceState({},"",`${p}`)}),bs(e,{viewport$:t,header$:r}).pipe(w(s=>i.next(s)),_(()=>i.complete()),m(s=>$({ref:e},s)))})}function vs(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:a}})=>a),Be(2,1),m(([a,s])=>a>s&&s>0),K()),i=r.pipe(m(({active:a})=>a));return N([i,n]).pipe(m(([a,s])=>!(a&&s)),K(),W(o.pipe(Ce(1))),ie(!0),ct({delay:250}),m(a=>({hidden:a})))}function Ei(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new g,a=i.pipe(Z(),ie(!0));return i.subscribe({next({hidden:s}){e.hidden=s,s?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(W(a),te("height")).subscribe(({height:s})=>{e.style.top=`${s+16}px`}),h(e,"click").subscribe(s=>{s.preventDefault(),window.scrollTo({top:0})}),vs(e,{viewport$:t,main$:o,target$:n}).pipe(w(s=>i.next(s)),_(()=>i.complete()),m(s=>$({ref:e},s)))}function wi({document$:e,viewport$:t}){e.pipe(v(()=>P(".md-ellipsis")),ne(r=>tt(r).pipe(W(e.pipe(Ce(1))),b(o=>o),m(()=>r),Te(1))),b(r=>r.offsetWidth{let o=r.innerText,n=r.closest("a")||r;return n.title=o,B("content.tooltips")?mt(n,{viewport$:t}).pipe(W(e.pipe(Ce(1))),_(()=>n.removeAttribute("title"))):S})).subscribe(),B("content.tooltips")&&e.pipe(v(()=>P(".md-status")),ne(r=>mt(r,{viewport$:t}))).subscribe()}function Ti({document$:e,tablet$:t}){e.pipe(v(()=>P(".md-toggle--indeterminate")),w(r=>{r.indeterminate=!0,r.checked=!1}),ne(r=>h(r,"change").pipe(Vr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),re(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function gs(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function Si({document$:e}){e.pipe(v(()=>P("[data-md-scrollfix]")),w(t=>t.removeAttribute("data-md-scrollfix")),b(gs),ne(t=>h(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function Oi({viewport$:e,tablet$:t}){N([Ne("search"),t]).pipe(m(([r,o])=>r&&!o),v(r=>I(r).pipe(Ge(r?400:100))),re(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function ys(){return location.protocol==="file:"?wt(`${new URL("search/search_index.js",eo.base)}`).pipe(m(()=>__index),G(1)):je(new URL("search/search_index.json",eo.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var ot=Go(),Ft=sn(),Ot=ln(Ft),to=an(),Oe=gn(),hr=$t("(min-width: 60em)"),Mi=$t("(min-width: 76.25em)"),_i=mn(),eo=xe(),Ai=document.forms.namedItem("search")?ys():Ye,ro=new g;Zn({alert$:ro});var oo=new g;B("navigation.instant")&&oi({location$:Ft,viewport$:Oe,progress$:oo}).subscribe(ot);var Li;((Li=eo.version)==null?void 0:Li.provider)==="mike"&&ci({document$:ot});O(Ft,Ot).pipe(Ge(125)).subscribe(()=>{Je("drawer",!1),Je("search",!1)});to.pipe(b(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=fe("link[rel=prev]");typeof t!="undefined"&<(t);break;case"n":case".":let r=fe("link[rel=next]");typeof r!="undefined"&<(r);break;case"Enter":let o=Ie();o instanceof HTMLLabelElement&&o.click()}});wi({viewport$:Oe,document$:ot});Ti({document$:ot,tablet$:hr});Si({document$:ot});Oi({viewport$:Oe,tablet$:hr});var rt=Kn(Se("header"),{viewport$:Oe}),jt=ot.pipe(m(()=>Se("main")),v(e=>Gn(e,{viewport$:Oe,header$:rt})),G(1)),xs=O(...ae("consent").map(e=>En(e,{target$:Ot})),...ae("dialog").map(e=>qn(e,{alert$:ro})),...ae("palette").map(e=>Jn(e)),...ae("progress").map(e=>Xn(e,{progress$:oo})),...ae("search").map(e=>ui(e,{index$:Ai,keyboard$:to})),...ae("source").map(e=>gi(e))),Es=C(()=>O(...ae("announce").map(e=>xn(e)),...ae("content").map(e=>Nn(e,{viewport$:Oe,target$:Ot,print$:_i})),...ae("content").map(e=>B("search.highlight")?di(e,{index$:Ai,location$:Ft}):S),...ae("header").map(e=>Yn(e,{viewport$:Oe,header$:rt,main$:jt})),...ae("header-title").map(e=>Bn(e,{viewport$:Oe,header$:rt})),...ae("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?zr(Mi,()=>Zr(e,{viewport$:Oe,header$:rt,main$:jt})):zr(hr,()=>Zr(e,{viewport$:Oe,header$:rt,main$:jt}))),...ae("tabs").map(e=>yi(e,{viewport$:Oe,header$:rt})),...ae("toc").map(e=>xi(e,{viewport$:Oe,header$:rt,main$:jt,target$:Ot})),...ae("top").map(e=>Ei(e,{viewport$:Oe,header$:rt,main$:jt,target$:Ot})))),Ci=ot.pipe(v(()=>Es),Re(xs),G(1));Ci.subscribe();window.document$=ot;window.location$=Ft;window.target$=Ot;window.keyboard$=to;window.viewport$=Oe;window.tablet$=hr;window.screen$=Mi;window.print$=_i;window.alert$=ro;window.progress$=oo;window.component$=Ci;})(); +//# sourceMappingURL=bundle.f55a23d4.min.js.map + diff --git a/v1/assets/javascripts/bundle.f55a23d4.min.js.map b/v1/assets/javascripts/bundle.f55a23d4.min.js.map new file mode 100644 index 00000000..e3de73ff --- /dev/null +++ b/v1/assets/javascripts/bundle.f55a23d4.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/escape-html/index.js", "node_modules/clipboard/dist/clipboard.js", "src/templates/assets/javascripts/bundle.ts", "node_modules/tslib/tslib.es6.mjs", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subscription.ts", "node_modules/rxjs/src/internal/config.ts", "node_modules/rxjs/src/internal/scheduler/timeoutProvider.ts", "node_modules/rxjs/src/internal/util/reportUnhandledError.ts", "node_modules/rxjs/src/internal/util/noop.ts", "node_modules/rxjs/src/internal/NotificationFactories.ts", "node_modules/rxjs/src/internal/util/errorContext.ts", "node_modules/rxjs/src/internal/Subscriber.ts", "node_modules/rxjs/src/internal/symbol/observable.ts", "node_modules/rxjs/src/internal/util/identity.ts", "node_modules/rxjs/src/internal/util/pipe.ts", "node_modules/rxjs/src/internal/Observable.ts", "node_modules/rxjs/src/internal/util/lift.ts", "node_modules/rxjs/src/internal/operators/OperatorSubscriber.ts", "node_modules/rxjs/src/internal/scheduler/animationFrameProvider.ts", "node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts", "node_modules/rxjs/src/internal/Subject.ts", "node_modules/rxjs/src/internal/BehaviorSubject.ts", "node_modules/rxjs/src/internal/scheduler/dateTimestampProvider.ts", "node_modules/rxjs/src/internal/ReplaySubject.ts", "node_modules/rxjs/src/internal/scheduler/Action.ts", "node_modules/rxjs/src/internal/scheduler/intervalProvider.ts", "node_modules/rxjs/src/internal/scheduler/AsyncAction.ts", "node_modules/rxjs/src/internal/Scheduler.ts", "node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts", "node_modules/rxjs/src/internal/scheduler/async.ts", "node_modules/rxjs/src/internal/scheduler/QueueAction.ts", "node_modules/rxjs/src/internal/scheduler/QueueScheduler.ts", "node_modules/rxjs/src/internal/scheduler/queue.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts", "node_modules/rxjs/src/internal/scheduler/animationFrame.ts", "node_modules/rxjs/src/internal/observable/empty.ts", "node_modules/rxjs/src/internal/util/isScheduler.ts", "node_modules/rxjs/src/internal/util/args.ts", "node_modules/rxjs/src/internal/util/isArrayLike.ts", "node_modules/rxjs/src/internal/util/isPromise.ts", "node_modules/rxjs/src/internal/util/isInteropObservable.ts", "node_modules/rxjs/src/internal/util/isAsyncIterable.ts", "node_modules/rxjs/src/internal/util/throwUnobservableError.ts", "node_modules/rxjs/src/internal/symbol/iterator.ts", "node_modules/rxjs/src/internal/util/isIterable.ts", "node_modules/rxjs/src/internal/util/isReadableStreamLike.ts", "node_modules/rxjs/src/internal/observable/innerFrom.ts", "node_modules/rxjs/src/internal/util/executeSchedule.ts", "node_modules/rxjs/src/internal/operators/observeOn.ts", "node_modules/rxjs/src/internal/operators/subscribeOn.ts", "node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts", "node_modules/rxjs/src/internal/scheduled/schedulePromise.ts", "node_modules/rxjs/src/internal/scheduled/scheduleArray.ts", "node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleAsyncIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleReadableStreamLike.ts", "node_modules/rxjs/src/internal/scheduled/scheduled.ts", "node_modules/rxjs/src/internal/observable/from.ts", "node_modules/rxjs/src/internal/observable/of.ts", "node_modules/rxjs/src/internal/observable/throwError.ts", "node_modules/rxjs/src/internal/util/EmptyError.ts", "node_modules/rxjs/src/internal/util/isDate.ts", "node_modules/rxjs/src/internal/operators/map.ts", "node_modules/rxjs/src/internal/util/mapOneOrManyArgs.ts", "node_modules/rxjs/src/internal/util/argsArgArrayOrObject.ts", "node_modules/rxjs/src/internal/util/createObject.ts", "node_modules/rxjs/src/internal/observable/combineLatest.ts", "node_modules/rxjs/src/internal/operators/mergeInternals.ts", "node_modules/rxjs/src/internal/operators/mergeMap.ts", "node_modules/rxjs/src/internal/operators/mergeAll.ts", "node_modules/rxjs/src/internal/operators/concatAll.ts", "node_modules/rxjs/src/internal/observable/concat.ts", "node_modules/rxjs/src/internal/observable/defer.ts", "node_modules/rxjs/src/internal/observable/fromEvent.ts", "node_modules/rxjs/src/internal/observable/fromEventPattern.ts", "node_modules/rxjs/src/internal/observable/timer.ts", "node_modules/rxjs/src/internal/observable/merge.ts", "node_modules/rxjs/src/internal/observable/never.ts", "node_modules/rxjs/src/internal/util/argsOrArgArray.ts", "node_modules/rxjs/src/internal/operators/filter.ts", "node_modules/rxjs/src/internal/observable/zip.ts", "node_modules/rxjs/src/internal/operators/audit.ts", "node_modules/rxjs/src/internal/operators/auditTime.ts", "node_modules/rxjs/src/internal/operators/bufferCount.ts", "node_modules/rxjs/src/internal/operators/catchError.ts", "node_modules/rxjs/src/internal/operators/scanInternals.ts", "node_modules/rxjs/src/internal/operators/combineLatest.ts", "node_modules/rxjs/src/internal/operators/combineLatestWith.ts", "node_modules/rxjs/src/internal/operators/debounce.ts", "node_modules/rxjs/src/internal/operators/debounceTime.ts", "node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts", "node_modules/rxjs/src/internal/operators/take.ts", "node_modules/rxjs/src/internal/operators/ignoreElements.ts", "node_modules/rxjs/src/internal/operators/mapTo.ts", "node_modules/rxjs/src/internal/operators/delayWhen.ts", "node_modules/rxjs/src/internal/operators/delay.ts", "node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts", "node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts", "node_modules/rxjs/src/internal/operators/throwIfEmpty.ts", "node_modules/rxjs/src/internal/operators/endWith.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/first.ts", "node_modules/rxjs/src/internal/operators/takeLast.ts", "node_modules/rxjs/src/internal/operators/merge.ts", "node_modules/rxjs/src/internal/operators/mergeWith.ts", "node_modules/rxjs/src/internal/operators/repeat.ts", "node_modules/rxjs/src/internal/operators/scan.ts", "node_modules/rxjs/src/internal/operators/share.ts", "node_modules/rxjs/src/internal/operators/shareReplay.ts", "node_modules/rxjs/src/internal/operators/skip.ts", "node_modules/rxjs/src/internal/operators/skipUntil.ts", "node_modules/rxjs/src/internal/operators/startWith.ts", "node_modules/rxjs/src/internal/operators/switchMap.ts", "node_modules/rxjs/src/internal/operators/takeUntil.ts", "node_modules/rxjs/src/internal/operators/takeWhile.ts", "node_modules/rxjs/src/internal/operators/tap.ts", "node_modules/rxjs/src/internal/operators/throttle.ts", "node_modules/rxjs/src/internal/operators/throttleTime.ts", "node_modules/rxjs/src/internal/operators/withLatestFrom.ts", "node_modules/rxjs/src/internal/operators/zip.ts", "node_modules/rxjs/src/internal/operators/zipWith.ts", "src/templates/assets/javascripts/browser/document/index.ts", "src/templates/assets/javascripts/browser/element/_/index.ts", "src/templates/assets/javascripts/browser/element/focus/index.ts", "src/templates/assets/javascripts/browser/element/hover/index.ts", "src/templates/assets/javascripts/utilities/h/index.ts", "src/templates/assets/javascripts/utilities/round/index.ts", "src/templates/assets/javascripts/browser/script/index.ts", "src/templates/assets/javascripts/browser/element/size/_/index.ts", "src/templates/assets/javascripts/browser/element/size/content/index.ts", "src/templates/assets/javascripts/browser/element/offset/_/index.ts", "src/templates/assets/javascripts/browser/element/offset/content/index.ts", "src/templates/assets/javascripts/browser/element/visibility/index.ts", "src/templates/assets/javascripts/browser/toggle/index.ts", "src/templates/assets/javascripts/browser/keyboard/index.ts", "src/templates/assets/javascripts/browser/location/_/index.ts", "src/templates/assets/javascripts/browser/location/hash/index.ts", "src/templates/assets/javascripts/browser/media/index.ts", "src/templates/assets/javascripts/browser/request/index.ts", "src/templates/assets/javascripts/browser/viewport/offset/index.ts", "src/templates/assets/javascripts/browser/viewport/size/index.ts", "src/templates/assets/javascripts/browser/viewport/_/index.ts", "src/templates/assets/javascripts/browser/viewport/at/index.ts", "src/templates/assets/javascripts/browser/worker/index.ts", "src/templates/assets/javascripts/_/index.ts", "src/templates/assets/javascripts/components/_/index.ts", "src/templates/assets/javascripts/components/announce/index.ts", "src/templates/assets/javascripts/components/consent/index.ts", "src/templates/assets/javascripts/templates/tooltip/index.tsx", "src/templates/assets/javascripts/templates/annotation/index.tsx", "src/templates/assets/javascripts/templates/clipboard/index.tsx", "src/templates/assets/javascripts/templates/search/index.tsx", "src/templates/assets/javascripts/templates/source/index.tsx", "src/templates/assets/javascripts/templates/tabbed/index.tsx", "src/templates/assets/javascripts/templates/table/index.tsx", "src/templates/assets/javascripts/templates/version/index.tsx", "src/templates/assets/javascripts/components/tooltip2/index.ts", "src/templates/assets/javascripts/components/content/annotation/_/index.ts", "src/templates/assets/javascripts/components/content/annotation/list/index.ts", "src/templates/assets/javascripts/components/content/annotation/block/index.ts", "src/templates/assets/javascripts/components/content/code/_/index.ts", "src/templates/assets/javascripts/components/content/details/index.ts", "src/templates/assets/javascripts/components/content/mermaid/index.css", "src/templates/assets/javascripts/components/content/mermaid/index.ts", "src/templates/assets/javascripts/components/content/table/index.ts", "src/templates/assets/javascripts/components/content/tabs/index.ts", "src/templates/assets/javascripts/components/content/_/index.ts", "src/templates/assets/javascripts/components/dialog/index.ts", "src/templates/assets/javascripts/components/tooltip/index.ts", "src/templates/assets/javascripts/components/header/_/index.ts", "src/templates/assets/javascripts/components/header/title/index.ts", "src/templates/assets/javascripts/components/main/index.ts", "src/templates/assets/javascripts/components/palette/index.ts", "src/templates/assets/javascripts/components/progress/index.ts", "src/templates/assets/javascripts/integrations/clipboard/index.ts", "src/templates/assets/javascripts/integrations/sitemap/index.ts", "src/templates/assets/javascripts/integrations/instant/index.ts", "src/templates/assets/javascripts/integrations/search/highlighter/index.ts", "src/templates/assets/javascripts/integrations/search/worker/message/index.ts", "src/templates/assets/javascripts/integrations/search/worker/_/index.ts", "src/templates/assets/javascripts/integrations/version/findurl/index.ts", "src/templates/assets/javascripts/integrations/version/index.ts", "src/templates/assets/javascripts/components/search/query/index.ts", "src/templates/assets/javascripts/components/search/result/index.ts", "src/templates/assets/javascripts/components/search/share/index.ts", "src/templates/assets/javascripts/components/search/suggest/index.ts", "src/templates/assets/javascripts/components/search/_/index.ts", "src/templates/assets/javascripts/components/search/highlight/index.ts", "src/templates/assets/javascripts/components/sidebar/index.ts", "src/templates/assets/javascripts/components/source/facts/github/index.ts", "src/templates/assets/javascripts/components/source/facts/gitlab/index.ts", "src/templates/assets/javascripts/components/source/facts/_/index.ts", "src/templates/assets/javascripts/components/source/_/index.ts", "src/templates/assets/javascripts/components/tabs/index.ts", "src/templates/assets/javascripts/components/toc/index.ts", "src/templates/assets/javascripts/components/top/index.ts", "src/templates/assets/javascripts/patches/ellipsis/index.ts", "src/templates/assets/javascripts/patches/indeterminate/index.ts", "src/templates/assets/javascripts/patches/scrollfix/index.ts", "src/templates/assets/javascripts/patches/scrolllock/index.ts", "src/templates/assets/javascripts/polyfills/index.ts"], + "sourcesContent": ["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-visible\n */\n function applyFocusVisiblePolyfill(scope) {\n var hadKeyboardEvent = true;\n var hadFocusVisibleRecently = false;\n var hadFocusVisibleRecentlyTimeout = null;\n\n var inputTypesAllowlist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n };\n\n /**\n * Helper function for legacy browsers and iframes which sometimes focus\n * elements like document, body, and non-interactive SVG.\n * @param {Element} el\n */\n function isValidFocusTarget(el) {\n if (\n el &&\n el !== document &&\n el.nodeName !== 'HTML' &&\n el.nodeName !== 'BODY' &&\n 'classList' in el &&\n 'contains' in el.classList\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} el\n * @return {boolean}\n */\n function focusTriggersKeyboardModality(el) {\n var type = el.type;\n var tagName = el.tagName;\n\n if (tagName === 'INPUT' && inputTypesAllowlist[type] && !el.readOnly) {\n return true;\n }\n\n if (tagName === 'TEXTAREA' && !el.readOnly) {\n return true;\n }\n\n if (el.isContentEditable) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Add the `focus-visible` class to the given element if it was not added by\n * the author.\n * @param {Element} el\n */\n function addFocusVisibleClass(el) {\n if (el.classList.contains('focus-visible')) {\n return;\n }\n el.classList.add('focus-visible');\n el.setAttribute('data-focus-visible-added', '');\n }\n\n /**\n * Remove the `focus-visible` class from the given element if it was not\n * originally added by the author.\n * @param {Element} el\n */\n function removeFocusVisibleClass(el) {\n if (!el.hasAttribute('data-focus-visible-added')) {\n return;\n }\n el.classList.remove('focus-visible');\n el.removeAttribute('data-focus-visible-added');\n }\n\n /**\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * Apply `focus-visible` to any current active element and keep track\n * of our keyboard modality state with `hadKeyboardEvent`.\n * @param {KeyboardEvent} e\n */\n function onKeyDown(e) {\n if (e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n\n if (isValidFocusTarget(scope.activeElement)) {\n addFocusVisibleClass(scope.activeElement);\n }\n\n hadKeyboardEvent = true;\n }\n\n /**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n * @param {Event} e\n */\n function onPointerDown(e) {\n hadKeyboardEvent = false;\n }\n\n /**\n * On `focus`, add the `focus-visible` class to the target if:\n * - the target received focus as a result of keyboard navigation, or\n * - the event target is an element that will likely require interaction\n * via the keyboard (e.g. a text box)\n * @param {Event} e\n */\n function onFocus(e) {\n // Prevent IE from focusing the document or HTML element.\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) {\n addFocusVisibleClass(e.target);\n }\n }\n\n /**\n * On `blur`, remove the `focus-visible` class from the target.\n * @param {Event} e\n */\n function onBlur(e) {\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (\n e.target.classList.contains('focus-visible') ||\n e.target.hasAttribute('data-focus-visible-added')\n ) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n hadFocusVisibleRecentlyTimeout = window.setTimeout(function() {\n hadFocusVisibleRecently = false;\n }, 100);\n removeFocusVisibleClass(e.target);\n }\n }\n\n /**\n * If the user changes tabs, keep track of whether or not the previously\n * focused element had .focus-visible.\n * @param {Event} e\n */\n function onVisibilityChange(e) {\n if (document.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n addInitialPointerMoveListeners();\n }\n }\n\n /**\n * Add a group of listeners to detect usage of any pointing devices.\n * These listeners will be added when the polyfill first loads, and anytime\n * the window is blurred, so that they are active when the window regains\n * focus.\n */\n function addInitialPointerMoveListeners() {\n document.addEventListener('mousemove', onInitialPointerMove);\n document.addEventListener('mousedown', onInitialPointerMove);\n document.addEventListener('mouseup', onInitialPointerMove);\n document.addEventListener('pointermove', onInitialPointerMove);\n document.addEventListener('pointerdown', onInitialPointerMove);\n document.addEventListener('pointerup', onInitialPointerMove);\n document.addEventListener('touchmove', onInitialPointerMove);\n document.addEventListener('touchstart', onInitialPointerMove);\n document.addEventListener('touchend', onInitialPointerMove);\n }\n\n function removeInitialPointerMoveListeners() {\n document.removeEventListener('mousemove', onInitialPointerMove);\n document.removeEventListener('mousedown', onInitialPointerMove);\n document.removeEventListener('mouseup', onInitialPointerMove);\n document.removeEventListener('pointermove', onInitialPointerMove);\n document.removeEventListener('pointerdown', onInitialPointerMove);\n document.removeEventListener('pointerup', onInitialPointerMove);\n document.removeEventListener('touchmove', onInitialPointerMove);\n document.removeEventListener('touchstart', onInitialPointerMove);\n document.removeEventListener('touchend', onInitialPointerMove);\n }\n\n /**\n * When the polfyill first loads, assume the user is in keyboard modality.\n * If any event is received from a pointing device (e.g. mouse, pointer,\n * touch), turn off keyboard modality.\n * This accounts for situations where focus enters the page from the URL bar.\n * @param {Event} e\n */\n function onInitialPointerMove(e) {\n // Work around a Safari quirk that fires a mousemove on whenever the\n // window blurs, even if you're tabbing out of the page. \u00AF\\_(\u30C4)_/\u00AF\n if (e.target.nodeName && e.target.nodeName.toLowerCase() === 'html') {\n return;\n }\n\n hadKeyboardEvent = false;\n removeInitialPointerMoveListeners();\n }\n\n // For some kinds of state, we are interested in changes at the global scope\n // only. For example, global pointer input, global key presses and global\n // visibility change should affect the state at every scope:\n document.addEventListener('keydown', onKeyDown, true);\n document.addEventListener('mousedown', onPointerDown, true);\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('touchstart', onPointerDown, true);\n document.addEventListener('visibilitychange', onVisibilityChange, true);\n\n addInitialPointerMoveListeners();\n\n // For focus and blur, we specifically care about state changes in the local\n // scope. This is because focus / blur events that originate from within a\n // shadow root are not re-dispatched from the host element if it was already\n // the active element in its own scope:\n scope.addEventListener('focus', onFocus, true);\n scope.addEventListener('blur', onBlur, true);\n\n // We detect that a node is a ShadowRoot by ensuring that it is a\n // DocumentFragment and also has a host property. This check covers native\n // implementation and polyfill implementation transparently. If we only cared\n // about the native implementation, we could just check if the scope was\n // an instance of a ShadowRoot.\n if (scope.nodeType === Node.DOCUMENT_FRAGMENT_NODE && scope.host) {\n // Since a ShadowRoot is a special kind of DocumentFragment, it does not\n // have a root element to add a class to. So, we add this attribute to the\n // host element instead:\n scope.host.setAttribute('data-js-focus-visible', '');\n } else if (scope.nodeType === Node.DOCUMENT_NODE) {\n document.documentElement.classList.add('js-focus-visible');\n document.documentElement.setAttribute('data-js-focus-visible', '');\n }\n }\n\n // It is important to wrap all references to global window and document in\n // these checks to support server-side rendering use cases\n // @see https://github.com/WICG/focus-visible/issues/199\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Make the polyfill helper globally available. This can be used as a signal\n // to interested libraries that wish to coordinate with the polyfill for e.g.,\n // applying the polyfill to a shadow root:\n window.applyFocusVisiblePolyfill = applyFocusVisiblePolyfill;\n\n // Notify interested libraries of the polyfill's presence, in case the\n // polyfill was loaded lazily:\n var event;\n\n try {\n event = new CustomEvent('focus-visible-polyfill-ready');\n } catch (error) {\n // IE11 does not support using CustomEvent as a constructor directly:\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('focus-visible-polyfill-ready', false, false, {});\n }\n\n window.dispatchEvent(event);\n }\n\n if (typeof document !== 'undefined') {\n // Apply the polyfill to the global document, so that no JavaScript\n // coordination is required to use the polyfill in the top-level document:\n applyFocusVisiblePolyfill(document);\n }\n\n})));\n", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "/*!\n * clipboard.js v2.0.11\n * https://clipboardjs.com/\n *\n * Licensed MIT \u00A9 Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 686:\n/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ clipboard; }\n});\n\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(279);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(370);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(817);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n;// CONCATENATED MODULE: ./src/common/command.js\n/**\n * Executes a given operation type.\n * @param {String} type\n * @return {Boolean}\n */\nfunction command(type) {\n try {\n return document.execCommand(type);\n } catch (err) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./src/actions/cut.js\n\n\n/**\n * Cut action wrapper.\n * @param {String|HTMLElement} target\n * @return {String}\n */\n\nvar ClipboardActionCut = function ClipboardActionCut(target) {\n var selectedText = select_default()(target);\n command('cut');\n return selectedText;\n};\n\n/* harmony default export */ var actions_cut = (ClipboardActionCut);\n;// CONCATENATED MODULE: ./src/common/create-fake-element.js\n/**\n * Creates a fake textarea element with a value.\n * @param {String} value\n * @return {HTMLElement}\n */\nfunction createFakeElement(value) {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS\n\n fakeElement.style.fontSize = '12pt'; // Reset box model\n\n fakeElement.style.border = '0';\n fakeElement.style.padding = '0';\n fakeElement.style.margin = '0'; // Move element out of screen horizontally\n\n fakeElement.style.position = 'absolute';\n fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n fakeElement.style.top = \"\".concat(yPosition, \"px\");\n fakeElement.setAttribute('readonly', '');\n fakeElement.value = value;\n return fakeElement;\n}\n;// CONCATENATED MODULE: ./src/actions/copy.js\n\n\n\n/**\n * Create fake copy action wrapper using a fake element.\n * @param {String} target\n * @param {Object} options\n * @return {String}\n */\n\nvar fakeCopyAction = function fakeCopyAction(value, options) {\n var fakeElement = createFakeElement(value);\n options.container.appendChild(fakeElement);\n var selectedText = select_default()(fakeElement);\n command('copy');\n fakeElement.remove();\n return selectedText;\n};\n/**\n * Copy action wrapper.\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @return {String}\n */\n\n\nvar ClipboardActionCopy = function ClipboardActionCopy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n _classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n }\n }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(686);\n/******/ })()\n.default;\n});", "/*\n * Copyright (c) 2016-2025 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport \"focus-visible\"\n\nimport {\n EMPTY,\n NEVER,\n Observable,\n Subject,\n defer,\n delay,\n filter,\n map,\n merge,\n mergeWith,\n shareReplay,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"./_\"\nimport {\n at,\n getActiveElement,\n getOptionalElement,\n requestJSON,\n setLocation,\n setToggle,\n watchDocument,\n watchKeyboard,\n watchLocation,\n watchLocationTarget,\n watchMedia,\n watchPrint,\n watchScript,\n watchViewport\n} from \"./browser\"\nimport {\n getComponentElement,\n getComponentElements,\n mountAnnounce,\n mountBackToTop,\n mountConsent,\n mountContent,\n mountDialog,\n mountHeader,\n mountHeaderTitle,\n mountPalette,\n mountProgress,\n mountSearch,\n mountSearchHiglight,\n mountSidebar,\n mountSource,\n mountTableOfContents,\n mountTabs,\n watchHeader,\n watchMain\n} from \"./components\"\nimport {\n SearchIndex,\n setupClipboardJS,\n setupInstantNavigation,\n setupVersionSelector\n} from \"./integrations\"\nimport {\n patchEllipsis,\n patchIndeterminate,\n patchScrollfix,\n patchScrolllock\n} from \"./patches\"\nimport \"./polyfills\"\n\n/* ----------------------------------------------------------------------------\n * Functions - @todo refactor\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch search index\n *\n * @returns Search index observable\n */\nfunction fetchSearchIndex(): Observable {\n if (location.protocol === \"file:\") {\n return watchScript(\n `${new URL(\"search/search_index.js\", config.base)}`\n )\n .pipe(\n // @ts-ignore - @todo fix typings\n map(() => __index),\n shareReplay(1)\n )\n } else {\n return requestJSON(\n new URL(\"search/search_index.json\", config.base)\n )\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Application\n * ------------------------------------------------------------------------- */\n\n/* Yay, JavaScript is available */\ndocument.documentElement.classList.remove(\"no-js\")\ndocument.documentElement.classList.add(\"js\")\n\n/* Set up navigation observables and subjects */\nconst document$ = watchDocument()\nconst location$ = watchLocation()\nconst target$ = watchLocationTarget(location$)\nconst keyboard$ = watchKeyboard()\n\n/* Set up media observables */\nconst viewport$ = watchViewport()\nconst tablet$ = watchMedia(\"(min-width: 60em)\")\nconst screen$ = watchMedia(\"(min-width: 76.25em)\")\nconst print$ = watchPrint()\n\n/* Retrieve search index, if search is enabled */\nconst config = configuration()\nconst index$ = document.forms.namedItem(\"search\")\n ? fetchSearchIndex()\n : NEVER\n\n/* Set up Clipboard.js integration */\nconst alert$ = new Subject()\nsetupClipboardJS({ alert$ })\n\n/* Set up progress indicator */\nconst progress$ = new Subject()\n\n/* Set up instant navigation, if enabled */\nif (feature(\"navigation.instant\"))\n setupInstantNavigation({ location$, viewport$, progress$ })\n .subscribe(document$)\n\n/* Set up version selector */\nif (config.version?.provider === \"mike\")\n setupVersionSelector({ document$ })\n\n/* Always close drawer and search on navigation */\nmerge(location$, target$)\n .pipe(\n delay(125)\n )\n .subscribe(() => {\n setToggle(\"drawer\", false)\n setToggle(\"search\", false)\n })\n\n/* Set up global keyboard handlers */\nkeyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Go to previous page */\n case \"p\":\n case \",\":\n const prev = getOptionalElement(\"link[rel=prev]\")\n if (typeof prev !== \"undefined\")\n setLocation(prev)\n break\n\n /* Go to next page */\n case \"n\":\n case \".\":\n const next = getOptionalElement(\"link[rel=next]\")\n if (typeof next !== \"undefined\")\n setLocation(next)\n break\n\n /* Expand navigation, see https://bit.ly/3ZjG5io */\n case \"Enter\":\n const active = getActiveElement()\n if (active instanceof HTMLLabelElement)\n active.click()\n }\n })\n\n/* Set up patches */\npatchEllipsis({ viewport$, document$ })\npatchIndeterminate({ document$, tablet$ })\npatchScrollfix({ document$ })\npatchScrolllock({ viewport$, tablet$ })\n\n/* Set up header and main area observable */\nconst header$ = watchHeader(getComponentElement(\"header\"), { viewport$ })\nconst main$ = document$\n .pipe(\n map(() => getComponentElement(\"main\")),\n switchMap(el => watchMain(el, { viewport$, header$ })),\n shareReplay(1)\n )\n\n/* Set up control component observables */\nconst control$ = merge(\n\n /* Consent */\n ...getComponentElements(\"consent\")\n .map(el => mountConsent(el, { target$ })),\n\n /* Dialog */\n ...getComponentElements(\"dialog\")\n .map(el => mountDialog(el, { alert$ })),\n\n /* Color palette */\n ...getComponentElements(\"palette\")\n .map(el => mountPalette(el)),\n\n /* Progress bar */\n ...getComponentElements(\"progress\")\n .map(el => mountProgress(el, { progress$ })),\n\n /* Search */\n ...getComponentElements(\"search\")\n .map(el => mountSearch(el, { index$, keyboard$ })),\n\n /* Repository information */\n ...getComponentElements(\"source\")\n .map(el => mountSource(el))\n)\n\n/* Set up content component observables */\nconst content$ = defer(() => merge(\n\n /* Announcement bar */\n ...getComponentElements(\"announce\")\n .map(el => mountAnnounce(el)),\n\n /* Content */\n ...getComponentElements(\"content\")\n .map(el => mountContent(el, { viewport$, target$, print$ })),\n\n /* Search highlighting */\n ...getComponentElements(\"content\")\n .map(el => feature(\"search.highlight\")\n ? mountSearchHiglight(el, { index$, location$ })\n : EMPTY\n ),\n\n /* Header */\n ...getComponentElements(\"header\")\n .map(el => mountHeader(el, { viewport$, header$, main$ })),\n\n /* Header title */\n ...getComponentElements(\"header-title\")\n .map(el => mountHeaderTitle(el, { viewport$, header$ })),\n\n /* Sidebar */\n ...getComponentElements(\"sidebar\")\n .map(el => el.getAttribute(\"data-md-type\") === \"navigation\"\n ? at(screen$, () => mountSidebar(el, { viewport$, header$, main$ }))\n : at(tablet$, () => mountSidebar(el, { viewport$, header$, main$ }))\n ),\n\n /* Navigation tabs */\n ...getComponentElements(\"tabs\")\n .map(el => mountTabs(el, { viewport$, header$ })),\n\n /* Table of contents */\n ...getComponentElements(\"toc\")\n .map(el => mountTableOfContents(el, {\n viewport$, header$, main$, target$\n })),\n\n /* Back-to-top button */\n ...getComponentElements(\"top\")\n .map(el => mountBackToTop(el, { viewport$, header$, main$, target$ }))\n))\n\n/* Set up component observables */\nconst component$ = document$\n .pipe(\n switchMap(() => content$),\n mergeWith(control$),\n shareReplay(1)\n )\n\n/* Subscribe to all components */\ncomponent$.subscribe()\n\n/* ----------------------------------------------------------------------------\n * Exports\n * ------------------------------------------------------------------------- */\n\nwindow.document$ = document$ /* Document observable */\nwindow.location$ = location$ /* Location subject */\nwindow.target$ = target$ /* Location target observable */\nwindow.keyboard$ = keyboard$ /* Keyboard observable */\nwindow.viewport$ = viewport$ /* Viewport observable */\nwindow.tablet$ = tablet$ /* Media tablet observable */\nwindow.screen$ = screen$ /* Media screen observable */\nwindow.print$ = print$ /* Media print observable */\nwindow.alert$ = alert$ /* Alert subject */\nwindow.progress$ = progress$ /* Progress indicator subject */\nwindow.component$ = component$ /* Component observable */\n", "/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n};\n", "/**\n * Returns true if the object is a function.\n * @param value The value to check\n */\nexport function isFunction(value: any): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n", "/**\n * Used to create Error subclasses until the community moves away from ES5.\n *\n * This is because compiling from TypeScript down to ES5 has issues with subclassing Errors\n * as well as other built-in types: https://github.com/Microsoft/TypeScript/issues/12123\n *\n * @param createImpl A factory function to create the actual constructor implementation. The returned\n * function should be a named function that calls `_super` internally.\n */\nexport function createErrorClass(createImpl: (_super: any) => any): T {\n const _super = (instance: any) => {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n\n const ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface UnsubscriptionError extends Error {\n readonly errors: any[];\n}\n\nexport interface UnsubscriptionErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (errors: any[]): UnsubscriptionError;\n}\n\n/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nexport const UnsubscriptionError: UnsubscriptionErrorCtor = createErrorClass(\n (_super) =>\n function UnsubscriptionErrorImpl(this: any, errors: (Error | string)[]) {\n _super(this);\n this.message = errors\n ? `${errors.length} errors occurred during unsubscription:\n${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\\n ')}`\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n }\n);\n", "/**\n * Removes an item from an array, mutating it.\n * @param arr The array to remove the item from\n * @param item The item to remove\n */\nexport function arrRemove(arr: T[] | undefined | null, item: T) {\n if (arr) {\n const index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { SubscriptionLike, TeardownLogic, Unsubscribable } from './types';\nimport { arrRemove } from './util/arrRemove';\n\n/**\n * Represents a disposable resource, such as the execution of an Observable. A\n * Subscription has one important method, `unsubscribe`, that takes no argument\n * and just disposes the resource held by the subscription.\n *\n * Additionally, subscriptions may be grouped together through the `add()`\n * method, which will attach a child Subscription to the current Subscription.\n * When a Subscription is unsubscribed, all its children (and its grandchildren)\n * will be unsubscribed as well.\n */\nexport class Subscription implements SubscriptionLike {\n public static EMPTY = (() => {\n const empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n\n /**\n * A flag to indicate whether this Subscription has already been unsubscribed.\n */\n public closed = false;\n\n private _parentage: Subscription[] | Subscription | null = null;\n\n /**\n * The list of registered finalizers to execute upon unsubscription. Adding and removing from this\n * list occurs in the {@link #add} and {@link #remove} methods.\n */\n private _finalizers: Exclude[] | null = null;\n\n /**\n * @param initialTeardown A function executed first as part of the finalization\n * process that is kicked off when {@link #unsubscribe} is called.\n */\n constructor(private initialTeardown?: () => void) {}\n\n /**\n * Disposes the resources held by the subscription. May, for instance, cancel\n * an ongoing Observable execution or cancel any other type of work that\n * started when the Subscription was created.\n */\n unsubscribe(): void {\n let errors: any[] | undefined;\n\n if (!this.closed) {\n this.closed = true;\n\n // Remove this from it's parents.\n const { _parentage } = this;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n for (const parent of _parentage) {\n parent.remove(this);\n }\n } else {\n _parentage.remove(this);\n }\n }\n\n const { initialTeardown: initialFinalizer } = this;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n } catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n\n const { _finalizers } = this;\n if (_finalizers) {\n this._finalizers = null;\n for (const finalizer of _finalizers) {\n try {\n execFinalizer(finalizer);\n } catch (err) {\n errors = errors ?? [];\n if (err instanceof UnsubscriptionError) {\n errors = [...errors, ...err.errors];\n } else {\n errors.push(err);\n }\n }\n }\n }\n\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n }\n\n /**\n * Adds a finalizer to this subscription, so that finalization will be unsubscribed/called\n * when this subscription is unsubscribed. If this subscription is already {@link #closed},\n * because it has already been unsubscribed, then whatever finalizer is passed to it\n * will automatically be executed (unless the finalizer itself is also a closed subscription).\n *\n * Closed Subscriptions cannot be added as finalizers to any subscription. Adding a closed\n * subscription to a any subscription will result in no operation. (A noop).\n *\n * Adding a subscription to itself, or adding `null` or `undefined` will not perform any\n * operation at all. (A noop).\n *\n * `Subscription` instances that are added to this instance will automatically remove themselves\n * if they are unsubscribed. Functions and {@link Unsubscribable} objects that you wish to remove\n * will need to be removed manually with {@link #remove}\n *\n * @param teardown The finalization logic to add to this subscription.\n */\n add(teardown: TeardownLogic): void {\n // Only add the finalizer if it's not undefined\n // and don't add a subscription to itself.\n if (teardown && teardown !== this) {\n if (this.closed) {\n // If this subscription is already closed,\n // execute whatever finalizer is handed to it automatically.\n execFinalizer(teardown);\n } else {\n if (teardown instanceof Subscription) {\n // We don't add closed subscriptions, and we don't add the same subscription\n // twice. Subscription unsubscribe is idempotent.\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = this._finalizers ?? []).push(teardown);\n }\n }\n }\n\n /**\n * Checks to see if a this subscription already has a particular parent.\n * This will signal that this subscription has already been added to the parent in question.\n * @param parent the parent to check for\n */\n private _hasParent(parent: Subscription) {\n const { _parentage } = this;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n }\n\n /**\n * Adds a parent to this subscription so it can be removed from the parent if it\n * unsubscribes on it's own.\n *\n * NOTE: THIS ASSUMES THAT {@link _hasParent} HAS ALREADY BEEN CHECKED.\n * @param parent The parent subscription to add\n */\n private _addParent(parent: Subscription) {\n const { _parentage } = this;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n }\n\n /**\n * Called on a child when it is removed via {@link #remove}.\n * @param parent The parent to remove\n */\n private _removeParent(parent: Subscription) {\n const { _parentage } = this;\n if (_parentage === parent) {\n this._parentage = null;\n } else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n }\n\n /**\n * Removes a finalizer from this subscription that was previously added with the {@link #add} method.\n *\n * Note that `Subscription` instances, when unsubscribed, will automatically remove themselves\n * from every other `Subscription` they have been added to. This means that using the `remove` method\n * is not a common thing and should be used thoughtfully.\n *\n * If you add the same finalizer instance of a function or an unsubscribable object to a `Subscription` instance\n * more than once, you will need to call `remove` the same number of times to remove all instances.\n *\n * All finalizer instances are removed to free up memory upon unsubscription.\n *\n * @param teardown The finalizer to remove from this subscription\n */\n remove(teardown: Exclude): void {\n const { _finalizers } = this;\n _finalizers && arrRemove(_finalizers, teardown);\n\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n }\n}\n\nexport const EMPTY_SUBSCRIPTION = Subscription.EMPTY;\n\nexport function isSubscription(value: any): value is Subscription {\n return (\n value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe))\n );\n}\n\nfunction execFinalizer(finalizer: Unsubscribable | (() => void)) {\n if (isFunction(finalizer)) {\n finalizer();\n } else {\n finalizer.unsubscribe();\n }\n}\n", "import { Subscriber } from './Subscriber';\nimport { ObservableNotification } from './types';\n\n/**\n * The {@link GlobalConfig} object for RxJS. It is used to configure things\n * like how to react on unhandled errors.\n */\nexport const config: GlobalConfig = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n\n/**\n * The global configuration object for RxJS, used to configure things\n * like how to react on unhandled errors. Accessible via {@link config}\n * object.\n */\nexport interface GlobalConfig {\n /**\n * A registration point for unhandled errors from RxJS. These are errors that\n * cannot were not handled by consuming code in the usual subscription path. For\n * example, if you have this configured, and you subscribe to an observable without\n * providing an error handler, errors from that subscription will end up here. This\n * will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onUnhandledError: ((err: any) => void) | null;\n\n /**\n * A registration point for notifications that cannot be sent to subscribers because they\n * have completed, errored or have been explicitly unsubscribed. By default, next, complete\n * and error notifications sent to stopped subscribers are noops. However, sometimes callers\n * might want a different behavior. For example, with sources that attempt to report errors\n * to stopped subscribers, a caller can configure RxJS to throw an unhandled error instead.\n * This will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onStoppedNotification: ((notification: ObservableNotification, subscriber: Subscriber) => void) | null;\n\n /**\n * The promise constructor used by default for {@link Observable#toPromise toPromise} and {@link Observable#forEach forEach}\n * methods.\n *\n * @deprecated As of version 8, RxJS will no longer support this sort of injection of a\n * Promise constructor. If you need a Promise implementation other than native promises,\n * please polyfill/patch Promise as you see appropriate. Will be removed in v8.\n */\n Promise?: PromiseConstructorLike;\n\n /**\n * If true, turns on synchronous error rethrowing, which is a deprecated behavior\n * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe\n * call in a try/catch block. It also enables producer interference, a nasty bug\n * where a multicast can be broken for all observers by a downstream consumer with\n * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BUY TIME\n * FOR MIGRATION REASONS.\n *\n * @deprecated As of version 8, RxJS will no longer support synchronous throwing\n * of unhandled errors. All errors will be thrown on a separate call stack to prevent bad\n * behaviors described above. Will be removed in v8.\n */\n useDeprecatedSynchronousErrorHandling: boolean;\n\n /**\n * If true, enables an as-of-yet undocumented feature from v5: The ability to access\n * `unsubscribe()` via `this` context in `next` functions created in observers passed\n * to `subscribe`.\n *\n * This is being removed because the performance was severely problematic, and it could also cause\n * issues when types other than POJOs are passed to subscribe as subscribers, as they will likely have\n * their `this` context overwritten.\n *\n * @deprecated As of version 8, RxJS will no longer support altering the\n * context of next functions provided as part of an observer to Subscribe. Instead,\n * you will have access to a subscription or a signal or token that will allow you to do things like\n * unsubscribe and test closed status. Will be removed in v8.\n */\n useDeprecatedNextContext: boolean;\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetTimeoutFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearTimeoutFunction = (handle: TimerHandle) => void;\n\ninterface TimeoutProvider {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n delegate:\n | {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n }\n | undefined;\n}\n\nexport const timeoutProvider: TimeoutProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setTimeout(handler: () => void, timeout?: number, ...args) {\n const { delegate } = timeoutProvider;\n if (delegate?.setTimeout) {\n return delegate.setTimeout(handler, timeout, ...args);\n }\n return setTimeout(handler, timeout, ...args);\n },\n clearTimeout(handle) {\n const { delegate } = timeoutProvider;\n return (delegate?.clearTimeout || clearTimeout)(handle as any);\n },\n delegate: undefined,\n};\n", "import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\n\n/**\n * Handles an error on another job either with the user-configured {@link onUnhandledError},\n * or by throwing it on that new job so it can be picked up by `window.onerror`, `process.on('error')`, etc.\n *\n * This should be called whenever there is an error that is out-of-band with the subscription\n * or when an error hits a terminal boundary of the subscription and no error handler was provided.\n *\n * @param err the error to report\n */\nexport function reportUnhandledError(err: any) {\n timeoutProvider.setTimeout(() => {\n const { onUnhandledError } = config;\n if (onUnhandledError) {\n // Execute the user-configured error handler.\n onUnhandledError(err);\n } else {\n // Throw so it is picked up by the runtime's uncaught error mechanism.\n throw err;\n }\n });\n}\n", "/* tslint:disable:no-empty */\nexport function noop() { }\n", "import { CompleteNotification, NextNotification, ErrorNotification } from './types';\n\n/**\n * A completion object optimized for memory use and created to be the\n * same \"shape\" as other notifications in v8.\n * @internal\n */\nexport const COMPLETE_NOTIFICATION = (() => createNotification('C', undefined, undefined) as CompleteNotification)();\n\n/**\n * Internal use only. Creates an optimized error notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function errorNotification(error: any): ErrorNotification {\n return createNotification('E', undefined, error) as any;\n}\n\n/**\n * Internal use only. Creates an optimized next notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function nextNotification(value: T) {\n return createNotification('N', value, undefined) as NextNotification;\n}\n\n/**\n * Ensures that all notifications created internally have the same \"shape\" in v8.\n *\n * TODO: This is only exported to support a crazy legacy test in `groupBy`.\n * @internal\n */\nexport function createNotification(kind: 'N' | 'E' | 'C', value: any, error: any) {\n return {\n kind,\n value,\n error,\n };\n}\n", "import { config } from '../config';\n\nlet context: { errorThrown: boolean; error: any } | null = null;\n\n/**\n * Handles dealing with errors for super-gross mode. Creates a context, in which\n * any synchronously thrown errors will be passed to {@link captureError}. Which\n * will record the error such that it will be rethrown after the call back is complete.\n * TODO: Remove in v8\n * @param cb An immediately executed function.\n */\nexport function errorContext(cb: () => void) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n const isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n const { errorThrown, error } = context!;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n } else {\n // This is the general non-deprecated path for everyone that\n // isn't crazy enough to use super-gross mode (useDeprecatedSynchronousErrorHandling)\n cb();\n }\n}\n\n/**\n * Captures errors only in super-gross mode.\n * @param err the error to capture\n */\nexport function captureError(err: any) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { Observer, ObservableNotification } from './types';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\n\n/**\n * Implements the {@link Observer} interface and extends the\n * {@link Subscription} class. While the {@link Observer} is the public API for\n * consuming the values of an {@link Observable}, all Observers get converted to\n * a Subscriber, in order to provide Subscription-like capabilities such as\n * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for\n * implementing operators, but it is rarely used as a public API.\n */\nexport class Subscriber extends Subscription implements Observer {\n /**\n * A static factory for a Subscriber, given a (potentially partial) definition\n * of an Observer.\n * @param next The `next` callback of an Observer.\n * @param error The `error` callback of an\n * Observer.\n * @param complete The `complete` callback of an\n * Observer.\n * @return A Subscriber wrapping the (partially defined)\n * Observer represented by the given arguments.\n * @deprecated Do not use. Will be removed in v8. There is no replacement for this\n * method, and there is no reason to be creating instances of `Subscriber` directly.\n * If you have a specific use case, please file an issue.\n */\n static create(next?: (x?: T) => void, error?: (e?: any) => void, complete?: () => void): Subscriber {\n return new SafeSubscriber(next, error, complete);\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected isStopped: boolean = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected destination: Subscriber | Observer; // this `any` is the escape hatch to erase extra type param (e.g. R)\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * There is no reason to directly create an instance of Subscriber. This type is exported for typings reasons.\n */\n constructor(destination?: Subscriber | Observer) {\n super();\n if (destination) {\n this.destination = destination;\n // Automatically chain subscriptions together here.\n // if destination is a Subscription, then it is a Subscriber.\n if (isSubscription(destination)) {\n destination.add(this);\n }\n } else {\n this.destination = EMPTY_OBSERVER;\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `next` from\n * the Observable, with a value. The Observable may call this method 0 or more\n * times.\n * @param value The `next` value.\n */\n next(value: T): void {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n } else {\n this._next(value!);\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `error` from\n * the Observable, with an attached `Error`. Notifies the Observer that\n * the Observable has experienced an error condition.\n * @param err The `error` exception.\n */\n error(err?: any): void {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n } else {\n this.isStopped = true;\n this._error(err);\n }\n }\n\n /**\n * The {@link Observer} callback to receive a valueless notification of type\n * `complete` from the Observable. Notifies the Observer that the Observable\n * has finished sending push-based notifications.\n */\n complete(): void {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n } else {\n this.isStopped = true;\n this._complete();\n }\n }\n\n unsubscribe(): void {\n if (!this.closed) {\n this.isStopped = true;\n super.unsubscribe();\n this.destination = null!;\n }\n }\n\n protected _next(value: T): void {\n this.destination.next(value);\n }\n\n protected _error(err: any): void {\n try {\n this.destination.error(err);\n } finally {\n this.unsubscribe();\n }\n }\n\n protected _complete(): void {\n try {\n this.destination.complete();\n } finally {\n this.unsubscribe();\n }\n }\n}\n\n/**\n * This bind is captured here because we want to be able to have\n * compatibility with monoid libraries that tend to use a method named\n * `bind`. In particular, a library called Monio requires this.\n */\nconst _bind = Function.prototype.bind;\n\nfunction bind any>(fn: Fn, thisArg: any): Fn {\n return _bind.call(fn, thisArg);\n}\n\n/**\n * Internal optimization only, DO NOT EXPOSE.\n * @internal\n */\nclass ConsumerObserver implements Observer {\n constructor(private partialObserver: Partial>) {}\n\n next(value: T): void {\n const { partialObserver } = this;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n\n error(err: any): void {\n const { partialObserver } = this;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n } catch (error) {\n handleUnhandledError(error);\n }\n } else {\n handleUnhandledError(err);\n }\n }\n\n complete(): void {\n const { partialObserver } = this;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n}\n\nexport class SafeSubscriber extends Subscriber {\n constructor(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((e?: any) => void) | null,\n complete?: (() => void) | null\n ) {\n super();\n\n let partialObserver: Partial>;\n if (isFunction(observerOrNext) || !observerOrNext) {\n // The first argument is a function, not an observer. The next\n // two arguments *could* be observers, or they could be empty.\n partialObserver = {\n next: (observerOrNext ?? undefined) as ((value: T) => void) | undefined,\n error: error ?? undefined,\n complete: complete ?? undefined,\n };\n } else {\n // The first argument is a partial observer.\n let context: any;\n if (this && config.useDeprecatedNextContext) {\n // This is a deprecated path that made `this.unsubscribe()` available in\n // next handler functions passed to subscribe. This only exists behind a flag\n // now, as it is *very* slow.\n context = Object.create(observerOrNext);\n context.unsubscribe = () => this.unsubscribe();\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context),\n error: observerOrNext.error && bind(observerOrNext.error, context),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context),\n };\n } else {\n // The \"normal\" path. Just use the partial observer directly.\n partialObserver = observerOrNext;\n }\n }\n\n // Wrap the partial observer to ensure it's a full observer, and\n // make sure proper error handling is accounted for.\n this.destination = new ConsumerObserver(partialObserver);\n }\n}\n\nfunction handleUnhandledError(error: any) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n } else {\n // Ideal path, we report this as an unhandled error,\n // which is thrown on a new call stack.\n reportUnhandledError(error);\n }\n}\n\n/**\n * An error handler used when no error handler was supplied\n * to the SafeSubscriber -- meaning no error handler was supplied\n * do the `subscribe` call on our observable.\n * @param err The error to handle\n */\nfunction defaultErrorHandler(err: any) {\n throw err;\n}\n\n/**\n * A handler for notifications that cannot be sent to a stopped subscriber.\n * @param notification The notification being sent.\n * @param subscriber The stopped subscriber.\n */\nfunction handleStoppedNotification(notification: ObservableNotification, subscriber: Subscriber) {\n const { onStoppedNotification } = config;\n onStoppedNotification && timeoutProvider.setTimeout(() => onStoppedNotification(notification, subscriber));\n}\n\n/**\n * The observer used as a stub for subscriptions where the user did not\n * pass any arguments to `subscribe`. Comes with the default error handling\n * behavior.\n */\nexport const EMPTY_OBSERVER: Readonly> & { closed: true } = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n", "/**\n * Symbol.observable or a string \"@@observable\". Used for interop\n *\n * @deprecated We will no longer be exporting this symbol in upcoming versions of RxJS.\n * Instead polyfill and use Symbol.observable directly *or* use https://www.npmjs.com/package/symbol-observable\n */\nexport const observable: string | symbol = (() => (typeof Symbol === 'function' && Symbol.observable) || '@@observable')();\n", "/**\n * This function takes one parameter and just returns it. Simply put,\n * this is like `(x: T): T => x`.\n *\n * ## Examples\n *\n * This is useful in some cases when using things like `mergeMap`\n *\n * ```ts\n * import { interval, take, map, range, mergeMap, identity } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(5));\n *\n * const result$ = source$.pipe(\n * map(i => range(i)),\n * mergeMap(identity) // same as mergeMap(x => x)\n * );\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * Or when you want to selectively apply an operator\n *\n * ```ts\n * import { interval, take, identity } from 'rxjs';\n *\n * const shouldLimit = () => Math.random() < 0.5;\n *\n * const source$ = interval(1000);\n *\n * const result$ = source$.pipe(shouldLimit() ? take(5) : identity);\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * @param x Any value that is returned by this function\n * @returns The value passed as the first parameter to this function\n */\nexport function identity(x: T): T {\n return x;\n}\n", "import { identity } from './identity';\nimport { UnaryFunction } from '../types';\n\nexport function pipe(): typeof identity;\nexport function pipe(fn1: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction,\n ...fns: UnaryFunction[]\n): UnaryFunction;\n\n/**\n * pipe() can be called on one or more functions, each of which can take one argument (\"UnaryFunction\")\n * and uses it to return a value.\n * It returns a function that takes one argument, passes it to the first UnaryFunction, and then\n * passes the result to the next one, passes that result to the next one, and so on. \n */\nexport function pipe(...fns: Array>): UnaryFunction {\n return pipeFromArray(fns);\n}\n\n/** @internal */\nexport function pipeFromArray(fns: Array>): UnaryFunction {\n if (fns.length === 0) {\n return identity as UnaryFunction;\n }\n\n if (fns.length === 1) {\n return fns[0];\n }\n\n return function piped(input: T): R {\n return fns.reduce((prev: any, fn: UnaryFunction) => fn(prev), input as any);\n };\n}\n", "import { Operator } from './Operator';\nimport { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription, Subscription } from './Subscription';\nimport { TeardownLogic, OperatorFunction, Subscribable, Observer } from './types';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A representation of any set of values over any amount of time. This is the most basic building block\n * of RxJS.\n */\nexport class Observable implements Subscribable {\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n source: Observable | undefined;\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n operator: Operator | undefined;\n\n /**\n * @param subscribe The function that is called when the Observable is\n * initially subscribed to. This function is given a Subscriber, to which new values\n * can be `next`ed, or an `error` method can be called to raise an error, or\n * `complete` can be called to notify of a successful completion.\n */\n constructor(subscribe?: (this: Observable, subscriber: Subscriber) => TeardownLogic) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n\n // HACK: Since TypeScript inherits static properties too, we have to\n // fight against TypeScript here so Subject can have a different static create signature\n /**\n * Creates a new Observable by calling the Observable constructor\n * @param subscribe the subscriber function to be passed to the Observable constructor\n * @return A new observable.\n * @deprecated Use `new Observable()` instead. Will be removed in v8.\n */\n static create: (...args: any[]) => any = (subscribe?: (subscriber: Subscriber) => TeardownLogic) => {\n return new Observable(subscribe);\n };\n\n /**\n * Creates a new Observable, with this Observable instance as the source, and the passed\n * operator defined as the new observable's operator.\n * @param operator the operator defining the operation to take on the observable\n * @return A new observable with the Operator applied.\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * If you have implemented an operator using `lift`, it is recommended that you create an\n * operator by simply returning `new Observable()` directly. See \"Creating new operators from\n * scratch\" section here: https://rxjs.dev/guide/operators\n */\n lift(operator?: Operator): Observable {\n const observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n }\n\n subscribe(observerOrNext?: Partial> | ((value: T) => void)): Subscription;\n /** @deprecated Instead of passing separate callback arguments, use an observer argument. Signatures taking separate callback arguments will be removed in v8. Details: https://rxjs.dev/deprecations/subscribe-arguments */\n subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription;\n /**\n * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.\n *\n * Use it when you have all these Observables, but still nothing is happening.\n *\n * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It\n * might be for example a function that you passed to Observable's constructor, but most of the time it is\n * a library implementation, which defines what will be emitted by an Observable, and when it be will emitted. This means\n * that calling `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often\n * the thought.\n *\n * Apart from starting the execution of an Observable, this method allows you to listen for values\n * that an Observable emits, as well as for when it completes or errors. You can achieve this in two\n * of the following ways.\n *\n * The first way is creating an object that implements {@link Observer} interface. It should have methods\n * defined by that interface, but note that it should be just a regular JavaScript object, which you can create\n * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular, do\n * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also\n * that your object does not have to implement all methods. If you find yourself creating a method that doesn't\n * do anything, you can simply omit it. Note however, if the `error` method is not provided and an error happens,\n * it will be thrown asynchronously. Errors thrown asynchronously cannot be caught using `try`/`catch`. Instead,\n * use the {@link onUnhandledError} configuration option or use a runtime handler (like `window.onerror` or\n * `process.on('error)`) to be notified of unhandled errors. Because of this, it's recommended that you provide\n * an `error` method to avoid missing thrown errors.\n *\n * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.\n * This means you can provide three functions as arguments to `subscribe`, where the first function is equivalent\n * of a `next` method, the second of an `error` method and the third of a `complete` method. Just as in case of an Observer,\n * if you do not need to listen for something, you can omit a function by passing `undefined` or `null`,\n * since `subscribe` recognizes these functions by where they were placed in function call. When it comes\n * to the `error` function, as with an Observer, if not provided, errors emitted by an Observable will be thrown asynchronously.\n *\n * You can, however, subscribe with no parameters at all. This may be the case where you're not interested in terminal events\n * and you also handled emissions internally by using operators (e.g. using `tap`).\n *\n * Whichever style of calling `subscribe` you use, in both cases it returns a Subscription object.\n * This object allows you to call `unsubscribe` on it, which in turn will stop the work that an Observable does and will clean\n * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback\n * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.\n *\n * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.\n * It is an Observable itself that decides when these functions will be called. For example {@link of}\n * by default emits all its values synchronously. Always check documentation for how given Observable\n * will behave when subscribed and if its default behavior can be modified with a `scheduler`.\n *\n * #### Examples\n *\n * Subscribe with an {@link guide/observer Observer}\n *\n * ```ts\n * import { of } from 'rxjs';\n *\n * const sumObserver = {\n * sum: 0,\n * next(value) {\n * console.log('Adding: ' + value);\n * this.sum = this.sum + value;\n * },\n * error() {\n * // We actually could just remove this method,\n * // since we do not really care about errors right now.\n * },\n * complete() {\n * console.log('Sum equals: ' + this.sum);\n * }\n * };\n *\n * of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.\n * .subscribe(sumObserver);\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Subscribe with functions ({@link deprecations/subscribe-arguments deprecated})\n *\n * ```ts\n * import { of } from 'rxjs'\n *\n * let sum = 0;\n *\n * of(1, 2, 3).subscribe(\n * value => {\n * console.log('Adding: ' + value);\n * sum = sum + value;\n * },\n * undefined,\n * () => console.log('Sum equals: ' + sum)\n * );\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Cancel a subscription\n *\n * ```ts\n * import { interval } from 'rxjs';\n *\n * const subscription = interval(1000).subscribe({\n * next(num) {\n * console.log(num)\n * },\n * complete() {\n * // Will not be called, even when cancelling subscription.\n * console.log('completed!');\n * }\n * });\n *\n * setTimeout(() => {\n * subscription.unsubscribe();\n * console.log('unsubscribed!');\n * }, 2500);\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // 'unsubscribed!' after 2.5s\n * ```\n *\n * @param observerOrNext Either an {@link Observer} with some or all callback methods,\n * or the `next` handler that is called for each value emitted from the subscribed Observable.\n * @param error A handler for a terminal event resulting from an error. If no error handler is provided,\n * the error will be thrown asynchronously as unhandled.\n * @param complete A handler for a terminal event resulting from successful completion.\n * @return A subscription reference to the registered handlers.\n */\n subscribe(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((error: any) => void) | null,\n complete?: (() => void) | null\n ): Subscription {\n const subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n\n errorContext(() => {\n const { operator, source } = this;\n subscriber.add(\n operator\n ? // We're dealing with a subscription in the\n // operator chain to one of our lifted operators.\n operator.call(subscriber, source)\n : source\n ? // If `source` has a value, but `operator` does not, something that\n // had intimate knowledge of our API, like our `Subject`, must have\n // set it. We're going to just call `_subscribe` directly.\n this._subscribe(subscriber)\n : // In all other cases, we're likely wrapping a user-provided initializer\n // function, so we need to catch errors and handle them appropriately.\n this._trySubscribe(subscriber)\n );\n });\n\n return subscriber;\n }\n\n /** @internal */\n protected _trySubscribe(sink: Subscriber): TeardownLogic {\n try {\n return this._subscribe(sink);\n } catch (err) {\n // We don't need to return anything in this case,\n // because it's just going to try to `add()` to a subscription\n // above.\n sink.error(err);\n }\n }\n\n /**\n * Used as a NON-CANCELLABLE means of subscribing to an observable, for use with\n * APIs that expect promises, like `async/await`. You cannot unsubscribe from this.\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * #### Example\n *\n * ```ts\n * import { interval, take } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(4));\n *\n * async function getTotal() {\n * let total = 0;\n *\n * await source$.forEach(value => {\n * total += value;\n * console.log('observable -> ' + value);\n * });\n *\n * return total;\n * }\n *\n * getTotal().then(\n * total => console.log('Total: ' + total)\n * );\n *\n * // Expected:\n * // 'observable -> 0'\n * // 'observable -> 1'\n * // 'observable -> 2'\n * // 'observable -> 3'\n * // 'Total: 6'\n * ```\n *\n * @param next A handler for each value emitted by the observable.\n * @return A promise that either resolves on observable completion or\n * rejects with the handled error.\n */\n forEach(next: (value: T) => void): Promise;\n\n /**\n * @param next a handler for each value emitted by the observable\n * @param promiseCtor a constructor function used to instantiate the Promise\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n * @deprecated Passing a Promise constructor will no longer be available\n * in upcoming versions of RxJS. This is because it adds weight to the library, for very\n * little benefit. If you need this functionality, it is recommended that you either\n * polyfill Promise, or you create an adapter to convert the returned native promise\n * to whatever promise implementation you wanted. Will be removed in v8.\n */\n forEach(next: (value: T) => void, promiseCtor: PromiseConstructorLike): Promise;\n\n forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n const subscriber = new SafeSubscriber({\n next: (value) => {\n try {\n next(value);\n } catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n this.subscribe(subscriber);\n }) as Promise;\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): TeardownLogic {\n return this.source?.subscribe(subscriber);\n }\n\n /**\n * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n * @return This instance of the observable.\n */\n [Symbol_observable]() {\n return this;\n }\n\n /* tslint:disable:max-line-length */\n pipe(): Observable;\n pipe(op1: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction,\n ...operations: OperatorFunction[]\n ): Observable;\n /* tslint:enable:max-line-length */\n\n /**\n * Used to stitch together functional operators into a chain.\n *\n * ## Example\n *\n * ```ts\n * import { interval, filter, map, scan } from 'rxjs';\n *\n * interval(1000)\n * .pipe(\n * filter(x => x % 2 === 0),\n * map(x => x + x),\n * scan((acc, x) => acc + x)\n * )\n * .subscribe(x => console.log(x));\n * ```\n *\n * @return The Observable result of all the operators having been called\n * in the order they were passed in.\n */\n pipe(...operations: OperatorFunction[]): Observable {\n return pipeFromArray(operations)(this);\n }\n\n /* tslint:disable:max-line-length */\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: typeof Promise): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: PromiseConstructorLike): Promise;\n /* tslint:enable:max-line-length */\n\n /**\n * Subscribe to this Observable and get a Promise resolving on\n * `complete` with the last emission (if any).\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * @param [promiseCtor] a constructor function used to instantiate\n * the Promise\n * @return A Promise that resolves with the last value emit, or\n * rejects on an error. If there were no emissions, Promise\n * resolves with undefined.\n * @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise\n */\n toPromise(promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n let value: T | undefined;\n this.subscribe(\n (x: T) => (value = x),\n (err: any) => reject(err),\n () => resolve(value)\n );\n }) as Promise;\n }\n}\n\n/**\n * Decides between a passed promise constructor from consuming code,\n * A default configured promise constructor, and the native promise\n * constructor and returns it. If nothing can be found, it will throw\n * an error.\n * @param promiseCtor The optional promise constructor to passed by consuming code\n */\nfunction getPromiseCtor(promiseCtor: PromiseConstructorLike | undefined) {\n return promiseCtor ?? config.Promise ?? Promise;\n}\n\nfunction isObserver(value: any): value is Observer {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\n\nfunction isSubscriber(value: any): value is Subscriber {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n", "import { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { OperatorFunction } from '../types';\nimport { isFunction } from './isFunction';\n\n/**\n * Used to determine if an object is an Observable with a lift function.\n */\nexport function hasLift(source: any): source is { lift: InstanceType['lift'] } {\n return isFunction(source?.lift);\n}\n\n/**\n * Creates an `OperatorFunction`. Used to define operators throughout the library in a concise way.\n * @param init The logic to connect the liftedSource to the subscriber at the moment of subscription.\n */\nexport function operate(\n init: (liftedSource: Observable, subscriber: Subscriber) => (() => void) | void\n): OperatorFunction {\n return (source: Observable) => {\n if (hasLift(source)) {\n return source.lift(function (this: Subscriber, liftedSource: Observable) {\n try {\n return init(liftedSource, this);\n } catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n", "import { Subscriber } from '../Subscriber';\n\n/**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional teardown logic here. This will only be called on teardown if the\n * subscriber itself is not already closed. This is called after all other teardown logic is executed.\n */\nexport function createOperatorSubscriber(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n onFinalize?: () => void\n): Subscriber {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\n\n/**\n * A generic helper for allowing operators to be created with a Subscriber and\n * use closures to capture necessary state from the operator function itself.\n */\nexport class OperatorSubscriber extends Subscriber {\n /**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional finalization logic here. This will only be called on finalization if the\n * subscriber itself is not already closed. This is called after all other finalization logic is executed.\n * @param shouldUnsubscribe An optional check to see if an unsubscribe call should truly unsubscribe.\n * NOTE: This currently **ONLY** exists to support the strange behavior of {@link groupBy}, where unsubscription\n * to the resulting observable does not actually disconnect from the source if there are active subscriptions\n * to any grouped observable. (DO NOT EXPOSE OR USE EXTERNALLY!!!)\n */\n constructor(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n private onFinalize?: () => void,\n private shouldUnsubscribe?: () => boolean\n ) {\n // It's important - for performance reasons - that all of this class's\n // members are initialized and that they are always initialized in the same\n // order. This will ensure that all OperatorSubscriber instances have the\n // same hidden class in V8. This, in turn, will help keep the number of\n // hidden classes involved in property accesses within the base class as\n // low as possible. If the number of hidden classes involved exceeds four,\n // the property accesses will become megamorphic and performance penalties\n // will be incurred - i.e. inline caches won't be used.\n //\n // The reasons for ensuring all instances have the same hidden class are\n // further discussed in this blog post from Benedikt Meurer:\n // https://benediktmeurer.de/2018/03/23/impact-of-polymorphism-on-component-based-frameworks-like-react/\n super(destination);\n this._next = onNext\n ? function (this: OperatorSubscriber, value: T) {\n try {\n onNext(value);\n } catch (err) {\n destination.error(err);\n }\n }\n : super._next;\n this._error = onError\n ? function (this: OperatorSubscriber, err: any) {\n try {\n onError(err);\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._error;\n this._complete = onComplete\n ? function (this: OperatorSubscriber) {\n try {\n onComplete();\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._complete;\n }\n\n unsubscribe() {\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n const { closed } = this;\n super.unsubscribe();\n // Execute additional teardown if we have any and we didn't already do so.\n !closed && this.onFinalize?.();\n }\n }\n}\n", "import { Subscription } from '../Subscription';\n\ninterface AnimationFrameProvider {\n schedule(callback: FrameRequestCallback): Subscription;\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n delegate:\n | {\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n }\n | undefined;\n}\n\nexport const animationFrameProvider: AnimationFrameProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n schedule(callback) {\n let request = requestAnimationFrame;\n let cancel: typeof cancelAnimationFrame | undefined = cancelAnimationFrame;\n const { delegate } = animationFrameProvider;\n if (delegate) {\n request = delegate.requestAnimationFrame;\n cancel = delegate.cancelAnimationFrame;\n }\n const handle = request((timestamp) => {\n // Clear the cancel function. The request has been fulfilled, so\n // attempting to cancel the request upon unsubscription would be\n // pointless.\n cancel = undefined;\n callback(timestamp);\n });\n return new Subscription(() => cancel?.(handle));\n },\n requestAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.requestAnimationFrame || requestAnimationFrame)(...args);\n },\n cancelAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.cancelAnimationFrame || cancelAnimationFrame)(...args);\n },\n delegate: undefined,\n};\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface ObjectUnsubscribedError extends Error {}\n\nexport interface ObjectUnsubscribedErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (): ObjectUnsubscribedError;\n}\n\n/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nexport const ObjectUnsubscribedError: ObjectUnsubscribedErrorCtor = createErrorClass(\n (_super) =>\n function ObjectUnsubscribedErrorImpl(this: any) {\n _super(this);\n this.name = 'ObjectUnsubscribedError';\n this.message = 'object unsubscribed';\n }\n);\n", "import { Operator } from './Operator';\nimport { Observable } from './Observable';\nimport { Subscriber } from './Subscriber';\nimport { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';\nimport { Observer, SubscriptionLike, TeardownLogic } from './types';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { arrRemove } from './util/arrRemove';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A Subject is a special type of Observable that allows values to be\n * multicasted to many Observers. Subjects are like EventEmitters.\n *\n * Every Subject is an Observable and an Observer. You can subscribe to a\n * Subject, and you can call next to feed values as well as error and complete.\n */\nexport class Subject extends Observable implements SubscriptionLike {\n closed = false;\n\n private currentObservers: Observer[] | null = null;\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n observers: Observer[] = [];\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n isStopped = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n hasError = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n thrownError: any = null;\n\n /**\n * Creates a \"subject\" by basically gluing an observer to an observable.\n *\n * @deprecated Recommended you do not use. Will be removed at some point in the future. Plans for replacement still under discussion.\n */\n static create: (...args: any[]) => any = (destination: Observer, source: Observable): AnonymousSubject => {\n return new AnonymousSubject(destination, source);\n };\n\n constructor() {\n // NOTE: This must be here to obscure Observable's constructor.\n super();\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n lift(operator: Operator): Observable {\n const subject = new AnonymousSubject(this, this);\n subject.operator = operator as any;\n return subject as any;\n }\n\n /** @internal */\n protected _throwIfClosed() {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n }\n\n next(value: T) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n if (!this.currentObservers) {\n this.currentObservers = Array.from(this.observers);\n }\n for (const observer of this.currentObservers) {\n observer.next(value);\n }\n }\n });\n }\n\n error(err: any) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.hasError = this.isStopped = true;\n this.thrownError = err;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.error(err);\n }\n }\n });\n }\n\n complete() {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.isStopped = true;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.complete();\n }\n }\n });\n }\n\n unsubscribe() {\n this.isStopped = this.closed = true;\n this.observers = this.currentObservers = null!;\n }\n\n get observed() {\n return this.observers?.length > 0;\n }\n\n /** @internal */\n protected _trySubscribe(subscriber: Subscriber): TeardownLogic {\n this._throwIfClosed();\n return super._trySubscribe(subscriber);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._checkFinalizedStatuses(subscriber);\n return this._innerSubscribe(subscriber);\n }\n\n /** @internal */\n protected _innerSubscribe(subscriber: Subscriber) {\n const { hasError, isStopped, observers } = this;\n if (hasError || isStopped) {\n return EMPTY_SUBSCRIPTION;\n }\n this.currentObservers = null;\n observers.push(subscriber);\n return new Subscription(() => {\n this.currentObservers = null;\n arrRemove(observers, subscriber);\n });\n }\n\n /** @internal */\n protected _checkFinalizedStatuses(subscriber: Subscriber) {\n const { hasError, thrownError, isStopped } = this;\n if (hasError) {\n subscriber.error(thrownError);\n } else if (isStopped) {\n subscriber.complete();\n }\n }\n\n /**\n * Creates a new Observable with this Subject as the source. You can do this\n * to create custom Observer-side logic of the Subject and conceal it from\n * code that uses the Observable.\n * @return Observable that this Subject casts to.\n */\n asObservable(): Observable {\n const observable: any = new Observable();\n observable.source = this;\n return observable;\n }\n}\n\nexport class AnonymousSubject extends Subject {\n constructor(\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n public destination?: Observer,\n source?: Observable\n ) {\n super();\n this.source = source;\n }\n\n next(value: T) {\n this.destination?.next?.(value);\n }\n\n error(err: any) {\n this.destination?.error?.(err);\n }\n\n complete() {\n this.destination?.complete?.();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n return this.source?.subscribe(subscriber) ?? EMPTY_SUBSCRIPTION;\n }\n}\n", "import { Subject } from './Subject';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\n\n/**\n * A variant of Subject that requires an initial value and emits its current\n * value whenever it is subscribed to.\n */\nexport class BehaviorSubject extends Subject {\n constructor(private _value: T) {\n super();\n }\n\n get value(): T {\n return this.getValue();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n const subscription = super._subscribe(subscriber);\n !subscription.closed && subscriber.next(this._value);\n return subscription;\n }\n\n getValue(): T {\n const { hasError, thrownError, _value } = this;\n if (hasError) {\n throw thrownError;\n }\n this._throwIfClosed();\n return _value;\n }\n\n next(value: T): void {\n super.next((this._value = value));\n }\n}\n", "import { TimestampProvider } from '../types';\n\ninterface DateTimestampProvider extends TimestampProvider {\n delegate: TimestampProvider | undefined;\n}\n\nexport const dateTimestampProvider: DateTimestampProvider = {\n now() {\n // Use the variable rather than `this` so that the function can be called\n // without being bound to the provider.\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n", "import { Subject } from './Subject';\nimport { TimestampProvider } from './types';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * A variant of {@link Subject} that \"replays\" old values to new subscribers by emitting them when they first subscribe.\n *\n * `ReplaySubject` has an internal buffer that will store a specified number of values that it has observed. Like `Subject`,\n * `ReplaySubject` \"observes\" values by having them passed to its `next` method. When it observes a value, it will store that\n * value for a time determined by the configuration of the `ReplaySubject`, as passed to its constructor.\n *\n * When a new subscriber subscribes to the `ReplaySubject` instance, it will synchronously emit all values in its buffer in\n * a First-In-First-Out (FIFO) manner. The `ReplaySubject` will also complete, if it has observed completion; and it will\n * error if it has observed an error.\n *\n * There are two main configuration items to be concerned with:\n *\n * 1. `bufferSize` - This will determine how many items are stored in the buffer, defaults to infinite.\n * 2. `windowTime` - The amount of time to hold a value in the buffer before removing it from the buffer.\n *\n * Both configurations may exist simultaneously. So if you would like to buffer a maximum of 3 values, as long as the values\n * are less than 2 seconds old, you could do so with a `new ReplaySubject(3, 2000)`.\n *\n * ### Differences with BehaviorSubject\n *\n * `BehaviorSubject` is similar to `new ReplaySubject(1)`, with a couple of exceptions:\n *\n * 1. `BehaviorSubject` comes \"primed\" with a single value upon construction.\n * 2. `ReplaySubject` will replay values, even after observing an error, where `BehaviorSubject` will not.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n * @see {@link shareReplay}\n */\nexport class ReplaySubject extends Subject {\n private _buffer: (T | number)[] = [];\n private _infiniteTimeWindow = true;\n\n /**\n * @param _bufferSize The size of the buffer to replay on subscription\n * @param _windowTime The amount of time the buffered items will stay buffered\n * @param _timestampProvider An object with a `now()` method that provides the current timestamp. This is used to\n * calculate the amount of time something has been buffered.\n */\n constructor(\n private _bufferSize = Infinity,\n private _windowTime = Infinity,\n private _timestampProvider: TimestampProvider = dateTimestampProvider\n ) {\n super();\n this._infiniteTimeWindow = _windowTime === Infinity;\n this._bufferSize = Math.max(1, _bufferSize);\n this._windowTime = Math.max(1, _windowTime);\n }\n\n next(value: T): void {\n const { isStopped, _buffer, _infiniteTimeWindow, _timestampProvider, _windowTime } = this;\n if (!isStopped) {\n _buffer.push(value);\n !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);\n }\n this._trimBuffer();\n super.next(value);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._trimBuffer();\n\n const subscription = this._innerSubscribe(subscriber);\n\n const { _infiniteTimeWindow, _buffer } = this;\n // We use a copy here, so reentrant code does not mutate our array while we're\n // emitting it to a new subscriber.\n const copy = _buffer.slice();\n for (let i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {\n subscriber.next(copy[i] as T);\n }\n\n this._checkFinalizedStatuses(subscriber);\n\n return subscription;\n }\n\n private _trimBuffer() {\n const { _bufferSize, _timestampProvider, _buffer, _infiniteTimeWindow } = this;\n // If we don't have an infinite buffer size, and we're over the length,\n // use splice to truncate the old buffer values off. Note that we have to\n // double the size for instances where we're not using an infinite time window\n // because we're storing the values and the timestamps in the same array.\n const adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;\n _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);\n\n // Now, if we're not in an infinite time window, remove all values where the time is\n // older than what is allowed.\n if (!_infiniteTimeWindow) {\n const now = _timestampProvider.now();\n let last = 0;\n // Search the array for the first timestamp that isn't expired and\n // truncate the buffer up to that point.\n for (let i = 1; i < _buffer.length && (_buffer[i] as number) <= now; i += 2) {\n last = i;\n }\n last && _buffer.splice(0, last + 1);\n }\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Subscription } from '../Subscription';\nimport { SchedulerAction } from '../types';\n\n/**\n * A unit of work to be executed in a `scheduler`. An action is typically\n * created from within a {@link SchedulerLike} and an RxJS user does not need to concern\n * themselves about creating and manipulating an Action.\n *\n * ```ts\n * class Action extends Subscription {\n * new (scheduler: Scheduler, work: (state?: T) => void);\n * schedule(state?: T, delay: number = 0): Subscription;\n * }\n * ```\n */\nexport class Action extends Subscription {\n constructor(scheduler: Scheduler, work: (this: SchedulerAction, state?: T) => void) {\n super();\n }\n /**\n * Schedules this action on its parent {@link SchedulerLike} for execution. May be passed\n * some context object, `state`. May happen at some point in the future,\n * according to the `delay` parameter, if specified.\n * @param state Some contextual data that the `work` function uses when called by the\n * Scheduler.\n * @param delay Time to wait before executing the work, where the time unit is implicit\n * and defined by the Scheduler.\n * @return A subscription in order to be able to unsubscribe the scheduled work.\n */\n public schedule(state?: T, delay: number = 0): Subscription {\n return this;\n }\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetIntervalFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearIntervalFunction = (handle: TimerHandle) => void;\n\ninterface IntervalProvider {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n delegate:\n | {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n }\n | undefined;\n}\n\nexport const intervalProvider: IntervalProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setInterval(handler: () => void, timeout?: number, ...args) {\n const { delegate } = intervalProvider;\n if (delegate?.setInterval) {\n return delegate.setInterval(handler, timeout, ...args);\n }\n return setInterval(handler, timeout, ...args);\n },\n clearInterval(handle) {\n const { delegate } = intervalProvider;\n return (delegate?.clearInterval || clearInterval)(handle as any);\n },\n delegate: undefined,\n};\n", "import { Action } from './Action';\nimport { SchedulerAction } from '../types';\nimport { Subscription } from '../Subscription';\nimport { AsyncScheduler } from './AsyncScheduler';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncAction extends Action {\n public id: TimerHandle | undefined;\n public state?: T;\n // @ts-ignore: Property has no initializer and is not definitely assigned\n public delay: number;\n protected pending: boolean = false;\n\n constructor(protected scheduler: AsyncScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (this.closed) {\n return this;\n }\n\n // Always replace the current state with the new state.\n this.state = state;\n\n const id = this.id;\n const scheduler = this.scheduler;\n\n //\n // Important implementation note:\n //\n // Actions only execute once by default, unless rescheduled from within the\n // scheduled callback. This allows us to implement single and repeat\n // actions via the same code path, without adding API surface area, as well\n // as mimic traditional recursion but across asynchronous boundaries.\n //\n // However, JS runtimes and timers distinguish between intervals achieved by\n // serial `setTimeout` calls vs. a single `setInterval` call. An interval of\n // serial `setTimeout` calls can be individually delayed, which delays\n // scheduling the next `setTimeout`, and so on. `setInterval` attempts to\n // guarantee the interval callback will be invoked more precisely to the\n // interval period, regardless of load.\n //\n // Therefore, we use `setInterval` to schedule single and repeat actions.\n // If the action reschedules itself with the same delay, the interval is not\n // canceled. If the action doesn't reschedule, or reschedules with a\n // different delay, the interval will be canceled after scheduled callback\n // execution.\n //\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n\n // Set the pending flag indicating that this action has been scheduled, or\n // has recursively rescheduled itself.\n this.pending = true;\n\n this.delay = delay;\n // If this action has already an async Id, don't request a new one.\n this.id = this.id ?? this.requestAsyncId(scheduler, this.id, delay);\n\n return this;\n }\n\n protected requestAsyncId(scheduler: AsyncScheduler, _id?: TimerHandle, delay: number = 0): TimerHandle {\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n }\n\n protected recycleAsyncId(_scheduler: AsyncScheduler, id?: TimerHandle, delay: number | null = 0): TimerHandle | undefined {\n // If this action is rescheduled with the same delay time, don't clear the interval id.\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n // Otherwise, if the action's delay time is different from the current delay,\n // or the action has been rescheduled before it's executed, clear the interval id\n if (id != null) {\n intervalProvider.clearInterval(id);\n }\n\n return undefined;\n }\n\n /**\n * Immediately executes this action and the `work` it contains.\n */\n public execute(state: T, delay: number): any {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n\n this.pending = false;\n const error = this._execute(state, delay);\n if (error) {\n return error;\n } else if (this.pending === false && this.id != null) {\n // Dequeue if the action didn't reschedule itself. Don't call\n // unsubscribe(), because the action could reschedule later.\n // For example:\n // ```\n // scheduler.schedule(function doWork(counter) {\n // /* ... I'm a busy worker bee ... */\n // var originalAction = this;\n // /* wait 100ms before rescheduling the action */\n // setTimeout(function () {\n // originalAction.schedule(counter + 1);\n // }, 100);\n // }, 1000);\n // ```\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n }\n\n protected _execute(state: T, _delay: number): any {\n let errored: boolean = false;\n let errorValue: any;\n try {\n this.work(state);\n } catch (e) {\n errored = true;\n // HACK: Since code elsewhere is relying on the \"truthiness\" of the\n // return here, we can't have it return \"\" or 0 or false.\n // TODO: Clean this up when we refactor schedulers mid-version-8 or so.\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n }\n\n unsubscribe() {\n if (!this.closed) {\n const { id, scheduler } = this;\n const { actions } = scheduler;\n\n this.work = this.state = this.scheduler = null!;\n this.pending = false;\n\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n\n this.delay = null!;\n super.unsubscribe();\n }\n }\n}\n", "import { Action } from './scheduler/Action';\nimport { Subscription } from './Subscription';\nimport { SchedulerLike, SchedulerAction } from './types';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * An execution context and a data structure to order tasks and schedule their\n * execution. Provides a notion of (potentially virtual) time, through the\n * `now()` getter method.\n *\n * Each unit of work in a Scheduler is called an `Action`.\n *\n * ```ts\n * class Scheduler {\n * now(): number;\n * schedule(work, delay?, state?): Subscription;\n * }\n * ```\n *\n * @deprecated Scheduler is an internal implementation detail of RxJS, and\n * should not be used directly. Rather, create your own class and implement\n * {@link SchedulerLike}. Will be made internal in v8.\n */\nexport class Scheduler implements SchedulerLike {\n public static now: () => number = dateTimestampProvider.now;\n\n constructor(private schedulerActionCtor: typeof Action, now: () => number = Scheduler.now) {\n this.now = now;\n }\n\n /**\n * A getter method that returns a number representing the current time\n * (at the time this function was called) according to the scheduler's own\n * internal clock.\n * @return A number that represents the current time. May or may not\n * have a relation to wall-clock time. May or may not refer to a time unit\n * (e.g. milliseconds).\n */\n public now: () => number;\n\n /**\n * Schedules a function, `work`, for execution. May happen at some point in\n * the future, according to the `delay` parameter, if specified. May be passed\n * some context object, `state`, which will be passed to the `work` function.\n *\n * The given arguments will be processed an stored as an Action object in a\n * queue of actions.\n *\n * @param work A function representing a task, or some unit of work to be\n * executed by the Scheduler.\n * @param delay Time to wait before executing the work, where the time unit is\n * implicit and defined by the Scheduler itself.\n * @param state Some contextual data that the `work` function uses when called\n * by the Scheduler.\n * @return A subscription in order to be able to unsubscribe the scheduled work.\n */\n public schedule(work: (this: SchedulerAction, state?: T) => void, delay: number = 0, state?: T): Subscription {\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Action } from './Action';\nimport { AsyncAction } from './AsyncAction';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncScheduler extends Scheduler {\n public actions: Array> = [];\n /**\n * A flag to indicate whether the Scheduler is currently executing a batch of\n * queued actions.\n * @internal\n */\n public _active: boolean = false;\n /**\n * An internal ID used to track the latest asynchronous task such as those\n * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and\n * others.\n * @internal\n */\n public _scheduled: TimerHandle | undefined;\n\n constructor(SchedulerAction: typeof Action, now: () => number = Scheduler.now) {\n super(SchedulerAction, now);\n }\n\n public flush(action: AsyncAction): void {\n const { actions } = this;\n\n if (this._active) {\n actions.push(action);\n return;\n }\n\n let error: any;\n this._active = true;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()!)); // exhaust the scheduler queue\n\n this._active = false;\n\n if (error) {\n while ((action = actions.shift()!)) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\n/**\n *\n * Async Scheduler\n *\n * Schedule task as if you used setTimeout(task, duration)\n *\n * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript\n * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating\n * in intervals.\n *\n * If you just want to \"defer\" task, that is to perform it right after currently\n * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),\n * better choice will be the {@link asapScheduler} scheduler.\n *\n * ## Examples\n * Use async scheduler to delay task\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * const task = () => console.log('it works!');\n *\n * asyncScheduler.schedule(task, 2000);\n *\n * // After 2 seconds logs:\n * // \"it works!\"\n * ```\n *\n * Use async scheduler to repeat task in intervals\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * function task(state) {\n * console.log(state);\n * this.schedule(state + 1, 1000); // `this` references currently executing Action,\n * // which we reschedule with new state and delay\n * }\n *\n * asyncScheduler.schedule(task, 3000, 0);\n *\n * // Logs:\n * // 0 after 3s\n * // 1 after 4s\n * // 2 after 5s\n * // 3 after 6s\n * ```\n */\n\nexport const asyncScheduler = new AsyncScheduler(AsyncAction);\n\n/**\n * @deprecated Renamed to {@link asyncScheduler}. Will be removed in v8.\n */\nexport const async = asyncScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { Subscription } from '../Subscription';\nimport { QueueScheduler } from './QueueScheduler';\nimport { SchedulerAction } from '../types';\nimport { TimerHandle } from './timerHandle';\n\nexport class QueueAction extends AsyncAction {\n constructor(protected scheduler: QueueScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (delay > 0) {\n return super.schedule(state, delay);\n }\n this.delay = delay;\n this.state = state;\n this.scheduler.flush(this);\n return this;\n }\n\n public execute(state: T, delay: number): any {\n return delay > 0 || this.closed ? super.execute(state, delay) : this._execute(state, delay);\n }\n\n protected requestAsyncId(scheduler: QueueScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n\n if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n\n // Otherwise flush the scheduler starting with this action.\n scheduler.flush(this);\n\n // HACK: In the past, this was returning `void`. However, `void` isn't a valid\n // `TimerHandle`, and generally the return value here isn't really used. So the\n // compromise is to return `0` which is both \"falsy\" and a valid `TimerHandle`,\n // as opposed to refactoring every other instanceo of `requestAsyncId`.\n return 0;\n }\n}\n", "import { AsyncScheduler } from './AsyncScheduler';\n\nexport class QueueScheduler extends AsyncScheduler {\n}\n", "import { QueueAction } from './QueueAction';\nimport { QueueScheduler } from './QueueScheduler';\n\n/**\n *\n * Queue Scheduler\n *\n * Put every next task on a queue, instead of executing it immediately\n *\n * `queue` scheduler, when used with delay, behaves the same as {@link asyncScheduler} scheduler.\n *\n * When used without delay, it schedules given task synchronously - executes it right when\n * it is scheduled. However when called recursively, that is when inside the scheduled task,\n * another task is scheduled with queue scheduler, instead of executing immediately as well,\n * that task will be put on a queue and wait for current one to finish.\n *\n * This means that when you execute task with `queue` scheduler, you are sure it will end\n * before any other task scheduled with that scheduler will start.\n *\n * ## Examples\n * Schedule recursively first, then do something\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(() => {\n * queueScheduler.schedule(() => console.log('second')); // will not happen now, but will be put on a queue\n *\n * console.log('first');\n * });\n *\n * // Logs:\n * // \"first\"\n * // \"second\"\n * ```\n *\n * Reschedule itself recursively\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(function(state) {\n * if (state !== 0) {\n * console.log('before', state);\n * this.schedule(state - 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * console.log('after', state);\n * }\n * }, 0, 3);\n *\n * // In scheduler that runs recursively, you would expect:\n * // \"before\", 3\n * // \"before\", 2\n * // \"before\", 1\n * // \"after\", 1\n * // \"after\", 2\n * // \"after\", 3\n *\n * // But with queue it logs:\n * // \"before\", 3\n * // \"after\", 3\n * // \"before\", 2\n * // \"after\", 2\n * // \"before\", 1\n * // \"after\", 1\n * ```\n */\n\nexport const queueScheduler = new QueueScheduler(QueueAction);\n\n/**\n * @deprecated Renamed to {@link queueScheduler}. Will be removed in v8.\n */\nexport const queue = queueScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\nimport { SchedulerAction } from '../types';\nimport { animationFrameProvider } from './animationFrameProvider';\nimport { TimerHandle } from './timerHandle';\n\nexport class AnimationFrameAction extends AsyncAction {\n constructor(protected scheduler: AnimationFrameScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n protected requestAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay is greater than 0, request as an async action.\n if (delay !== null && delay > 0) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n // Push the action to the end of the scheduler queue.\n scheduler.actions.push(this);\n // If an animation frame has already been requested, don't request another\n // one. If an animation frame hasn't been requested yet, request one. Return\n // the current animation frame request id.\n return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(() => scheduler.flush(undefined)));\n }\n\n protected recycleAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle | undefined {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if (delay != null ? delay > 0 : this.delay > 0) {\n return super.recycleAsyncId(scheduler, id, delay);\n }\n // If the scheduler queue has no remaining actions with the same async id,\n // cancel the requested animation frame and set the scheduled flag to\n // undefined so the next AnimationFrameAction will request its own.\n const { actions } = scheduler;\n if (id != null && id === scheduler._scheduled && actions[actions.length - 1]?.id !== id) {\n animationFrameProvider.cancelAnimationFrame(id as number);\n scheduler._scheduled = undefined;\n }\n // Return undefined so the action knows to request a new async id if it's rescheduled.\n return undefined;\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\nexport class AnimationFrameScheduler extends AsyncScheduler {\n public flush(action?: AsyncAction): void {\n this._active = true;\n // The async id that effects a call to flush is stored in _scheduled.\n // Before executing an action, it's necessary to check the action's async\n // id to determine whether it's supposed to be executed in the current\n // flush.\n // Previous implementations of this method used a count to determine this,\n // but that was unsound, as actions that are unsubscribed - i.e. cancelled -\n // are removed from the actions array and that can shift actions that are\n // scheduled to be executed in a subsequent flush into positions at which\n // they are executed within the current flush.\n let flushId;\n if (action) {\n flushId = action.id;\n } else {\n flushId = this._scheduled;\n this._scheduled = undefined;\n }\n\n const { actions } = this;\n let error: any;\n action = action || actions.shift()!;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions[0]) && action.id === flushId && actions.shift());\n\n this._active = false;\n\n if (error) {\n while ((action = actions[0]) && action.id === flushId && actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AnimationFrameAction } from './AnimationFrameAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\n\n/**\n *\n * Animation Frame Scheduler\n *\n * Perform task when `window.requestAnimationFrame` would fire\n *\n * When `animationFrame` scheduler is used with delay, it will fall back to {@link asyncScheduler} scheduler\n * behaviour.\n *\n * Without delay, `animationFrame` scheduler can be used to create smooth browser animations.\n * It makes sure scheduled task will happen just before next browser content repaint,\n * thus performing animations as efficiently as possible.\n *\n * ## Example\n * Schedule div height animation\n * ```ts\n * // html:
\n * import { animationFrameScheduler } from 'rxjs';\n *\n * const div = document.querySelector('div');\n *\n * animationFrameScheduler.schedule(function(height) {\n * div.style.height = height + \"px\";\n *\n * this.schedule(height + 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * }, 0, 0);\n *\n * // You will see a div element growing in height\n * ```\n */\n\nexport const animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);\n\n/**\n * @deprecated Renamed to {@link animationFrameScheduler}. Will be removed in v8.\n */\nexport const animationFrame = animationFrameScheduler;\n", "import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\n\n/**\n * A simple Observable that emits no items to the Observer and immediately\n * emits a complete notification.\n *\n * Just emits 'complete', and nothing else.\n *\n * ![](empty.png)\n *\n * A simple Observable that only emits the complete notification. It can be used\n * for composing with other Observables, such as in a {@link mergeMap}.\n *\n * ## Examples\n *\n * Log complete notification\n *\n * ```ts\n * import { EMPTY } from 'rxjs';\n *\n * EMPTY.subscribe({\n * next: () => console.log('Next'),\n * complete: () => console.log('Complete!')\n * });\n *\n * // Outputs\n * // Complete!\n * ```\n *\n * Emit the number 7, then complete\n *\n * ```ts\n * import { EMPTY, startWith } from 'rxjs';\n *\n * const result = EMPTY.pipe(startWith(7));\n * result.subscribe(x => console.log(x));\n *\n * // Outputs\n * // 7\n * ```\n *\n * Map and flatten only odd numbers to the sequence `'a'`, `'b'`, `'c'`\n *\n * ```ts\n * import { interval, mergeMap, of, EMPTY } from 'rxjs';\n *\n * const interval$ = interval(1000);\n * const result = interval$.pipe(\n * mergeMap(x => x % 2 === 1 ? of('a', 'b', 'c') : EMPTY),\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following to the console:\n * // x is equal to the count on the interval, e.g. (0, 1, 2, 3, ...)\n * // x will occur every 1000ms\n * // if x % 2 is equal to 1, print a, b, c (each on its own)\n * // if x % 2 is not equal to 1, nothing will be output\n * ```\n *\n * @see {@link Observable}\n * @see {@link NEVER}\n * @see {@link of}\n * @see {@link throwError}\n */\nexport const EMPTY = new Observable((subscriber) => subscriber.complete());\n\n/**\n * @param scheduler A {@link SchedulerLike} to use for scheduling\n * the emission of the complete notification.\n * @deprecated Replaced with the {@link EMPTY} constant or {@link scheduled} (e.g. `scheduled([], scheduler)`). Will be removed in v8.\n */\nexport function empty(scheduler?: SchedulerLike) {\n return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\n\nfunction emptyScheduled(scheduler: SchedulerLike) {\n return new Observable((subscriber) => scheduler.schedule(() => subscriber.complete()));\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport function isScheduler(value: any): value is SchedulerLike {\n return value && isFunction(value.schedule);\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\nimport { isScheduler } from './isScheduler';\n\nfunction last(arr: T[]): T | undefined {\n return arr[arr.length - 1];\n}\n\nexport function popResultSelector(args: any[]): ((...args: unknown[]) => unknown) | undefined {\n return isFunction(last(args)) ? args.pop() : undefined;\n}\n\nexport function popScheduler(args: any[]): SchedulerLike | undefined {\n return isScheduler(last(args)) ? args.pop() : undefined;\n}\n\nexport function popNumber(args: any[], defaultValue: number): number {\n return typeof last(args) === 'number' ? args.pop()! : defaultValue;\n}\n", "export const isArrayLike = ((x: any): x is ArrayLike => x && typeof x.length === 'number' && typeof x !== 'function');", "import { isFunction } from \"./isFunction\";\n\n/**\n * Tests to see if the object is \"thennable\".\n * @param value the object to test\n */\nexport function isPromise(value: any): value is PromiseLike {\n return isFunction(value?.then);\n}\n", "import { InteropObservable } from '../types';\nimport { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being Observable (but not necessary an Rx Observable) */\nexport function isInteropObservable(input: any): input is InteropObservable {\n return isFunction(input[Symbol_observable]);\n}\n", "import { isFunction } from './isFunction';\n\nexport function isAsyncIterable(obj: any): obj is AsyncIterable {\n return Symbol.asyncIterator && isFunction(obj?.[Symbol.asyncIterator]);\n}\n", "/**\n * Creates the TypeError to throw if an invalid object is passed to `from` or `scheduled`.\n * @param input The object that was passed.\n */\nexport function createInvalidObservableTypeError(input: any) {\n // TODO: We should create error codes that can be looked up, so this can be less verbose.\n return new TypeError(\n `You provided ${\n input !== null && typeof input === 'object' ? 'an invalid object' : `'${input}'`\n } where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`\n );\n}\n", "export function getSymbolIterator(): symbol {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator' as any;\n }\n\n return Symbol.iterator;\n}\n\nexport const iterator = getSymbolIterator();\n", "import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being an Iterable */\nexport function isIterable(input: any): input is Iterable {\n return isFunction(input?.[Symbol_iterator]);\n}\n", "import { ReadableStreamLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport async function* readableStreamLikeToAsyncGenerator(readableStream: ReadableStreamLike): AsyncGenerator {\n const reader = readableStream.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n return;\n }\n yield value!;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport function isReadableStreamLike(obj: any): obj is ReadableStreamLike {\n // We don't want to use instanceof checks because they would return\n // false for instances from another Realm, like an ');else if(o){var p="";p=m&&m.youtube?"lg-has-youtube":m&&m.vimeo?"lg-has-vimeo":"lg-has-html5",i.___slide[e].insertAdjacentHTML("beforeend",'
')}else m?(i.___slide[e].insertAdjacentHTML("beforeend",'
'),l.default.trigger(i.el,"hasVideo",{index:e,src:a,html:c})):(g=g?'alt="'+g+'"':"",i.___slide[e].insertAdjacentHTML("beforeend",'
'));if(l.default.trigger(i.el,"onAferAppendSlide",{index:e}),r=i.___slide[e].querySelector(".lg-object"),u&&r.setAttribute("sizes",u),n&&(r.setAttribute("srcset",n),this.s.supportLegacyBrowser))try{picturefill({elements:[r[0]]})}catch(e){console.warn("If you want srcset to be supported for older browsers, please include picturefil javascript library in your document.")}".lg-sub-html"!==this.s.appendSubHtmlTo&&i.addHtml(e),l.default.addClass(i.___slide[e],"lg-loaded")}l.default.on(i.___slide[e].querySelector(".lg-object"),"load.lg error.lg",function(){var t=0;s&&!l.default.hasClass(document.body,"lg-from-hash")&&(t=s),setTimeout(function(){l.default.addClass(i.___slide[e],"lg-complete"),l.default.trigger(i.el,"onSlideItemLoad",{index:e,delay:s||0})},t)}),m&&m.html5&&!o&&l.default.addClass(i.___slide[e],"lg-complete"),!0===t&&(l.default.hasClass(i.___slide[e],"lg-complete")?i.preload(e):l.default.on(i.___slide[e].querySelector(".lg-object"),"load.lg error.lg",function(){i.preload(e)}))},s.prototype.slide=function(e,t,s){for(var i=0,o=0;oi&&(n=!0,e!==a-1||0!==i||s||(u=!0,n=!1)),u?(l.default.addClass(this.___slide[e],"lg-prev-slide"),l.default.addClass(this.___slide[i],"lg-next-slide")):n&&(l.default.addClass(this.___slide[e],"lg-next-slide"),l.default.addClass(this.___slide[i],"lg-prev-slide")),setTimeout(function(){l.default.removeClass(r.outer.querySelector(".lg-current"),"lg-current"),l.default.addClass(r.___slide[e],"lg-current"),l.default.removeClass(r.outer,"lg-no-trans")},50)}r.lGalleryOn?(setTimeout(function(){r.loadContent(e,!0,0)},this.s.speed+50),setTimeout(function(){r.lgBusy=!1,l.default.trigger(r.el,"onAfterSlide",{prevIndex:i,index:e,fromTouch:t,fromThumb:s})},this.s.speed)):(r.loadContent(e,!0,r.s.backdropDuration),r.lgBusy=!1,l.default.trigger(r.el,"onAfterSlide",{prevIndex:i,index:e,fromTouch:t,fromThumb:s})),r.lGalleryOn=!0,this.s.counter&&document.getElementById("lg-counter-current")&&(document.getElementById("lg-counter-current").innerHTML=e+1)}}},s.prototype.goToNextSlide=function(e){var t=this;t.lgBusy||(t.index+10?(t.index--,l.default.trigger(t.el,"onBeforePrevSlide",{index:t.index,fromTouch:e}),t.slide(t.index,e,!1)):t.s.loop?(t.index=t.items.length-1,l.default.trigger(t.el,"onBeforePrevSlide",{index:t.index,fromTouch:e}),t.slide(t.index,e,!1)):t.s.slideEndAnimatoin&&(l.default.addClass(t.outer,"lg-left-end"),setTimeout(function(){l.default.removeClass(t.outer,"lg-left-end")},400)))},s.prototype.keyPress=function(){var e=this;this.items.length>1&&l.default.on(window,"keyup.lg",function(t){e.items.length>1&&(37===t.keyCode&&(t.preventDefault(),e.goToPrevSlide()),39===t.keyCode&&(t.preventDefault(),e.goToNextSlide()))}),l.default.on(window,"keydown.lg",function(t){!0===e.s.escKey&&27===t.keyCode&&(t.preventDefault(),l.default.hasClass(e.outer,"lg-thumb-open")?l.default.removeClass(e.outer,"lg-thumb-open"):e.destroy())})},s.prototype.arrow=function(){var e=this;l.default.on(this.outer.querySelector(".lg-prev"),"click.lg",function(){e.goToPrevSlide()}),l.default.on(this.outer.querySelector(".lg-next"),"click.lg",function(){e.goToNextSlide()})},s.prototype.arrowDisable=function(e){if(!this.s.loop&&this.s.hideControlOnEnd){var t=this.outer.querySelector(".lg-next"),s=this.outer.querySelector(".lg-prev");e+10?(s.removeAttribute("disabled"),l.default.removeClass(s,"disabled")):(s.setAttribute("disabled","disabled"),l.default.addClass(s,"disabled"))}},s.prototype.setTranslate=function(e,t,s){this.s.useLeft?e.style.left=t:l.default.setVendor(e,"Transform","translate3d("+t+"px, "+s+"px, 0px)")},s.prototype.touchMove=function(e,t){var s=t-e;Math.abs(s)>15&&(l.default.addClass(this.outer,"lg-dragging"),this.setTranslate(this.___slide[this.index],s,0),this.setTranslate(document.querySelector(".lg-prev-slide"),-this.___slide[this.index].clientWidth+s,0),this.setTranslate(document.querySelector(".lg-next-slide"),this.___slide[this.index].clientWidth+s,0))},s.prototype.touchEnd=function(e){var t=this;"lg-slide"!==t.s.mode&&l.default.addClass(t.outer,"lg-slide");for(var s=0;st.s.swipeThreshold?t.goToNextSlide(!0):e>0&&Math.abs(e)>t.s.swipeThreshold?t.goToPrevSlide(!0):Math.abs(e)<5&&l.default.trigger(t.el,"onSlideClick");for(var s=0;s-1&&l.default.addClass(this.___slide[t],"lg-prev-slide"),l.default.addClass(this.___slide[e],"lg-next-slide")},s.prototype.mousewheel=function(){var e=this;l.default.on(e.outer,"mousewheel.lg",function(t){t.deltaY&&(t.deltaY>0?e.goToPrevSlide():e.goToNextSlide(),t.preventDefault())})},s.prototype.closeGallery=function(){var e=this,t=!1;l.default.on(this.outer.querySelector(".lg-close"),"click.lg",function(){e.destroy()}),e.s.closable&&(l.default.on(e.outer,"mousedown.lg",function(e){t=!!(l.default.hasClass(e.target,"lg-outer")||l.default.hasClass(e.target,"lg-item")||l.default.hasClass(e.target,"lg-img-wrap"))}),l.default.on(e.outer,"mouseup.lg",function(s){(l.default.hasClass(s.target,"lg-outer")||l.default.hasClass(s.target,"lg-item")||l.default.hasClass(s.target,"lg-img-wrap")&&t)&&(l.default.hasClass(e.outer,"lg-dragging")||e.destroy())}))},s.prototype.destroy=function(e){var t=this;if(e||l.default.trigger(t.el,"onBeforeClose"),document.body.scrollTop=t.prevScrollTop,document.documentElement.scrollTop=t.prevScrollTop,e){if(!t.s.dynamic)for(var s=0;s=e;t=++e)r+=9===t||14===t||19===t||24===t?"-":15===t?"4":20===t?(Math.floor(4*Math.random())+8).toString(16):Math.floor(15*Math.random()).toString(16);return r}}).call(this),function(){e.Location=function(){function t(t){var e,r;null==t&&(t=""),r=document.createElement("a"),r.href=t.toString(),this.absoluteURL=r.href,e=r.hash.length,2>e?this.requestURL=this.absoluteURL:(this.requestURL=this.absoluteURL.slice(0,-e),this.anchor=r.hash.slice(1))}var e,r,n,o;return t.wrap=function(t){return t instanceof this?t:new this(t)},t.prototype.getOrigin=function(){return this.absoluteURL.split("/",3).join("/")},t.prototype.getPath=function(){var t,e;return null!=(t=null!=(e=this.requestURL.match(/\/\/[^\/]*(\/[^?;]*)/))?e[1]:void 0)?t:"/"},t.prototype.getPathComponents=function(){return this.getPath().split("/").slice(1)},t.prototype.getLastPathComponent=function(){return this.getPathComponents().slice(-1)[0]},t.prototype.getExtension=function(){var t,e;return null!=(t=null!=(e=this.getLastPathComponent().match(/\.[^.]*$/))?e[0]:void 0)?t:""},t.prototype.isHTML=function(){return this.getExtension().match(/^(?:|\.(?:htm|html|xhtml))$/)},t.prototype.isPrefixedBy=function(t){var e;return e=r(t),this.isEqualTo(t)||o(this.absoluteURL,e)},t.prototype.isEqualTo=function(t){return this.absoluteURL===(null!=t?t.absoluteURL:void 0)},t.prototype.toCacheKey=function(){return this.requestURL},t.prototype.toJSON=function(){return this.absoluteURL},t.prototype.toString=function(){return this.absoluteURL},t.prototype.valueOf=function(){return this.absoluteURL},r=function(t){return e(t.getOrigin()+t.getPath())},e=function(t){return n(t,"/")?t:t+"/"},o=function(t,e){return t.slice(0,e.length)===e},n=function(t,e){return t.slice(-e.length)===e},t}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.HttpRequest=function(){function r(r,n,o){this.delegate=r,this.requestCanceled=t(this.requestCanceled,this),this.requestTimedOut=t(this.requestTimedOut,this),this.requestFailed=t(this.requestFailed,this),this.requestLoaded=t(this.requestLoaded,this),this.requestProgressed=t(this.requestProgressed,this),this.url=e.Location.wrap(n).requestURL,this.referrer=e.Location.wrap(o).absoluteURL,this.createXHR()}return r.NETWORK_FAILURE=0,r.TIMEOUT_FAILURE=-1,r.timeout=60,r.prototype.send=function(){var t;return this.xhr&&!this.sent?(this.notifyApplicationBeforeRequestStart(),this.setProgress(0),this.xhr.send(),this.sent=!0,"function"==typeof(t=this.delegate).requestStarted?t.requestStarted():void 0):void 0},r.prototype.cancel=function(){return this.xhr&&this.sent?this.xhr.abort():void 0},r.prototype.requestProgressed=function(t){return t.lengthComputable?this.setProgress(t.loaded/t.total):void 0},r.prototype.requestLoaded=function(){return this.endRequest(function(t){return function(){var e;return 200<=(e=t.xhr.status)&&300>e?t.delegate.requestCompletedWithResponse(t.xhr.responseText,t.xhr.getResponseHeader("Turbolinks-Location")):(t.failed=!0,t.delegate.requestFailedWithStatusCode(t.xhr.status,t.xhr.responseText))}}(this))},r.prototype.requestFailed=function(){return this.endRequest(function(t){return function(){return t.failed=!0,t.delegate.requestFailedWithStatusCode(t.constructor.NETWORK_FAILURE)}}(this))},r.prototype.requestTimedOut=function(){return this.endRequest(function(t){return function(){return t.failed=!0,t.delegate.requestFailedWithStatusCode(t.constructor.TIMEOUT_FAILURE)}}(this))},r.prototype.requestCanceled=function(){return this.endRequest()},r.prototype.notifyApplicationBeforeRequestStart=function(){return e.dispatch("turbolinks:request-start",{data:{url:this.url,xhr:this.xhr}})},r.prototype.notifyApplicationAfterRequestEnd=function(){return e.dispatch("turbolinks:request-end",{data:{url:this.url,xhr:this.xhr}})},r.prototype.createXHR=function(){return this.xhr=new XMLHttpRequest,this.xhr.open("GET",this.url,!0),this.xhr.timeout=1e3*this.constructor.timeout,this.xhr.setRequestHeader("Accept","text/html, application/xhtml+xml"),this.xhr.setRequestHeader("Turbolinks-Referrer",this.referrer),this.xhr.onprogress=this.requestProgressed,this.xhr.onload=this.requestLoaded,this.xhr.onerror=this.requestFailed,this.xhr.ontimeout=this.requestTimedOut,this.xhr.onabort=this.requestCanceled},r.prototype.endRequest=function(t){return this.xhr?(this.notifyApplicationAfterRequestEnd(),null!=t&&t.call(this),this.destroy()):void 0},r.prototype.setProgress=function(t){var e;return this.progress=t,"function"==typeof(e=this.delegate).requestProgressed?e.requestProgressed(this.progress):void 0},r.prototype.destroy=function(){var t;return this.setProgress(1),"function"==typeof(t=this.delegate).requestFinished&&t.requestFinished(),this.delegate=null,this.xhr=null},r}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.ProgressBar=function(){function e(){this.trickle=t(this.trickle,this),this.stylesheetElement=this.createStylesheetElement(),this.progressElement=this.createProgressElement()}var r;return r=300,e.defaultCSS=".turbolinks-progress-bar {\n position: fixed;\n display: block;\n top: 0;\n left: 0;\n height: 3px;\n background: #0076ff;\n z-index: 9999;\n transition: width "+r+"ms ease-out, opacity "+r/2+"ms "+r/2+"ms ease-in;\n transform: translate3d(0, 0, 0);\n}",e.prototype.show=function(){return this.visible?void 0:(this.visible=!0,this.installStylesheetElement(),this.installProgressElement(),this.startTrickling())},e.prototype.hide=function(){return this.visible&&!this.hiding?(this.hiding=!0,this.fadeProgressElement(function(t){return function(){return t.uninstallProgressElement(),t.stopTrickling(),t.visible=!1,t.hiding=!1}}(this))):void 0},e.prototype.setValue=function(t){return this.value=t,this.refresh()},e.prototype.installStylesheetElement=function(){return document.head.insertBefore(this.stylesheetElement,document.head.firstChild)},e.prototype.installProgressElement=function(){return this.progressElement.style.width=0,this.progressElement.style.opacity=1,document.documentElement.insertBefore(this.progressElement,document.body),this.refresh()},e.prototype.fadeProgressElement=function(t){return this.progressElement.style.opacity=0,setTimeout(t,1.5*r)},e.prototype.uninstallProgressElement=function(){return this.progressElement.parentNode?document.documentElement.removeChild(this.progressElement):void 0},e.prototype.startTrickling=function(){return null!=this.trickleInterval?this.trickleInterval:this.trickleInterval=setInterval(this.trickle,r)},e.prototype.stopTrickling=function(){return clearInterval(this.trickleInterval),this.trickleInterval=null},e.prototype.trickle=function(){return this.setValue(this.value+Math.random()/100)},e.prototype.refresh=function(){return requestAnimationFrame(function(t){return function(){return t.progressElement.style.width=10+90*t.value+"%"}}(this))},e.prototype.createStylesheetElement=function(){var t;return t=document.createElement("style"),t.type="text/css",t.textContent=this.constructor.defaultCSS,t},e.prototype.createProgressElement=function(){var t;return t=document.createElement("div"),t.className="turbolinks-progress-bar",t},e}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.BrowserAdapter=function(){function r(r){this.controller=r,this.showProgressBar=t(this.showProgressBar,this),this.progressBar=new e.ProgressBar}var n,o,i;return i=e.HttpRequest,n=i.NETWORK_FAILURE,o=i.TIMEOUT_FAILURE,r.prototype.visitProposedToLocationWithAction=function(t,e){return this.controller.startVisitToLocationWithAction(t,e)},r.prototype.visitStarted=function(t){return t.issueRequest(),t.changeHistory(),t.loadCachedSnapshot()},r.prototype.visitRequestStarted=function(t){return this.progressBar.setValue(0),t.hasCachedSnapshot()||"restore"!==t.action?this.showProgressBarAfterDelay():this.showProgressBar()},r.prototype.visitRequestProgressed=function(t){return this.progressBar.setValue(t.progress)},r.prototype.visitRequestCompleted=function(t){return t.loadResponse()},r.prototype.visitRequestFailedWithStatusCode=function(t,e){switch(e){case n:case o:return this.reload();default:return t.loadResponse()}},r.prototype.visitRequestFinished=function(t){return this.hideProgressBar()},r.prototype.visitCompleted=function(t){return t.followRedirect()},r.prototype.pageInvalidated=function(){return this.reload()},r.prototype.showProgressBarAfterDelay=function(){return this.progressBarTimeout=setTimeout(this.showProgressBar,this.controller.progressBarDelay)},r.prototype.showProgressBar=function(){return this.progressBar.show()},r.prototype.hideProgressBar=function(){return this.progressBar.hide(),clearTimeout(this.progressBarTimeout)},r.prototype.reload=function(){return window.location.reload()},r}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.History=function(){function r(e){this.delegate=e,this.onPageLoad=t(this.onPageLoad,this),this.onPopState=t(this.onPopState,this)}return r.prototype.start=function(){return this.started?void 0:(addEventListener("popstate",this.onPopState,!1),addEventListener("load",this.onPageLoad,!1),this.started=!0)},r.prototype.stop=function(){return this.started?(removeEventListener("popstate",this.onPopState,!1),removeEventListener("load",this.onPageLoad,!1),this.started=!1):void 0},r.prototype.push=function(t,r){return t=e.Location.wrap(t),this.update("push",t,r)},r.prototype.replace=function(t,r){return t=e.Location.wrap(t),this.update("replace",t,r)},r.prototype.onPopState=function(t){var r,n,o,i;return this.shouldHandlePopState()&&(i=null!=(n=t.state)?n.turbolinks:void 0)?(r=e.Location.wrap(window.location),o=i.restorationIdentifier,this.delegate.historyPoppedToLocationWithRestorationIdentifier(r,o)):void 0},r.prototype.onPageLoad=function(t){return e.defer(function(t){return function(){return t.pageLoaded=!0}}(this))},r.prototype.shouldHandlePopState=function(){return this.pageIsLoaded()},r.prototype.pageIsLoaded=function(){return this.pageLoaded||"complete"===document.readyState},r.prototype.update=function(t,e,r){var n;return n={turbolinks:{restorationIdentifier:r}},history[t+"State"](n,null,e)},r}()}.call(this),function(){e.HeadDetails=function(){function t(t){var e,r,n,s,a,u;for(this.elements={},n=0,a=t.length;a>n;n++)u=t[n],u.nodeType===Node.ELEMENT_NODE&&(s=u.outerHTML,r=null!=(e=this.elements)[s]?e[s]:e[s]={type:i(u),tracked:o(u),elements:[]},r.elements.push(u))}var e,r,n,o,i;return t.fromHeadElement=function(t){var e;return new this(null!=(e=null!=t?t.childNodes:void 0)?e:[])},t.prototype.hasElementWithKey=function(t){return t in this.elements},t.prototype.getTrackedElementSignature=function(){var t,e;return function(){var r,n;r=this.elements,n=[];for(t in r)e=r[t].tracked,e&&n.push(t);return n}.call(this).join("")},t.prototype.getScriptElementsNotInDetails=function(t){return this.getElementsMatchingTypeNotInDetails("script",t)},t.prototype.getStylesheetElementsNotInDetails=function(t){return this.getElementsMatchingTypeNotInDetails("stylesheet",t)},t.prototype.getElementsMatchingTypeNotInDetails=function(t,e){var r,n,o,i,s,a;o=this.elements,s=[];for(n in o)i=o[n],a=i.type,r=i.elements,a!==t||e.hasElementWithKey(n)||s.push(r[0]);return s},t.prototype.getProvisionalElements=function(){var t,e,r,n,o,i,s;r=[],n=this.elements;for(e in n)o=n[e],s=o.type,i=o.tracked,t=o.elements,null!=s||i?t.length>1&&r.push.apply(r,t.slice(1)):r.push.apply(r,t);return r},t.prototype.getMetaValue=function(t){var e;return null!=(e=this.findMetaElementByName(t))?e.getAttribute("content"):void 0},t.prototype.findMetaElementByName=function(t){var r,n,o,i;r=void 0,i=this.elements;for(o in i)n=i[o].elements,e(n[0],t)&&(r=n[0]);return r},i=function(t){return r(t)?"script":n(t)?"stylesheet":void 0},o=function(t){return"reload"===t.getAttribute("data-turbolinks-track")},r=function(t){var e;return e=t.tagName.toLowerCase(),"script"===e},n=function(t){var e;return e=t.tagName.toLowerCase(),"style"===e||"link"===e&&"stylesheet"===t.getAttribute("rel")},e=function(t,e){var r;return r=t.tagName.toLowerCase(),"meta"===r&&t.getAttribute("name")===e},t}()}.call(this),function(){e.Snapshot=function(){function t(t,e){this.headDetails=t,this.bodyElement=e}return t.wrap=function(t){return t instanceof this?t:"string"==typeof t?this.fromHTMLString(t):this.fromHTMLElement(t)},t.fromHTMLString=function(t){var e;return e=document.createElement("html"),e.innerHTML=t,this.fromHTMLElement(e)},t.fromHTMLElement=function(t){var r,n,o,i;return o=t.querySelector("head"),r=null!=(i=t.querySelector("body"))?i:document.createElement("body"),n=e.HeadDetails.fromHeadElement(o),new this(n,r)},t.prototype.clone=function(){return new this.constructor(this.headDetails,this.bodyElement.cloneNode(!0))},t.prototype.getRootLocation=function(){var t,r;return r=null!=(t=this.getSetting("root"))?t:"/",new e.Location(r)},t.prototype.getCacheControlValue=function(){return this.getSetting("cache-control")},t.prototype.getElementForAnchor=function(t){try{return this.bodyElement.querySelector("[id='"+t+"'], a[name='"+t+"']")}catch(e){}},t.prototype.getPermanentElements=function(){return this.bodyElement.querySelectorAll("[id][data-turbolinks-permanent]")},t.prototype.getPermanentElementById=function(t){return this.bodyElement.querySelector("#"+t+"[data-turbolinks-permanent]")},t.prototype.getPermanentElementsPresentInSnapshot=function(t){var e,r,n,o,i;for(o=this.getPermanentElements(),i=[],r=0,n=o.length;n>r;r++)e=o[r],t.getPermanentElementById(e.id)&&i.push(e);return i},t.prototype.findFirstAutofocusableElement=function(){return this.bodyElement.querySelector("[autofocus]")},t.prototype.hasAnchor=function(t){return null!=this.getElementForAnchor(t)},t.prototype.isPreviewable=function(){return"no-preview"!==this.getCacheControlValue()},t.prototype.isCacheable=function(){return"no-cache"!==this.getCacheControlValue()},t.prototype.isVisitable=function(){return"reload"!==this.getSetting("visit-control")},t.prototype.getSetting=function(t){return this.headDetails.getMetaValue("turbolinks-"+t)},t}()}.call(this),function(){var t=[].slice;e.Renderer=function(){function e(){}var r;return e.render=function(){var e,r,n,o;return n=arguments[0],r=arguments[1],e=3<=arguments.length?t.call(arguments,2):[],o=function(t,e,r){r.prototype=t.prototype;var n=new r,o=t.apply(n,e);return Object(o)===o?o:n}(this,e,function(){}),o.delegate=n,o.render(r),o},e.prototype.renderView=function(t){return this.delegate.viewWillRender(this.newBody),t(),this.delegate.viewRendered(this.newBody)},e.prototype.invalidateView=function(){return this.delegate.viewInvalidated()},e.prototype.createScriptElement=function(t){var e;return"false"===t.getAttribute("data-turbolinks-eval")?t:(e=document.createElement("script"),e.textContent=t.textContent,e.async=!1,r(e,t),e)},r=function(t,e){var r,n,o,i,s,a,u;for(i=e.attributes,a=[],r=0,n=i.length;n>r;r++)s=i[r],o=s.name,u=s.value,a.push(t.setAttribute(o,u));return a},e}()}.call(this),function(){var t,r,n=function(t,e){function r(){this.constructor=t}for(var n in e)o.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},o={}.hasOwnProperty;e.SnapshotRenderer=function(e){function o(t,e,r){this.currentSnapshot=t,this.newSnapshot=e,this.isPreview=r,this.currentHeadDetails=this.currentSnapshot.headDetails,this.newHeadDetails=this.newSnapshot.headDetails,this.currentBody=this.currentSnapshot.bodyElement,this.newBody=this.newSnapshot.bodyElement}return n(o,e),o.prototype.render=function(t){return this.shouldRender()?(this.mergeHead(),this.renderView(function(e){return function(){return e.replaceBody(),e.isPreview||e.focusFirstAutofocusableElement(),t()}}(this))):this.invalidateView()},o.prototype.mergeHead=function(){return this.copyNewHeadStylesheetElements(),this.copyNewHeadScriptElements(),this.removeCurrentHeadProvisionalElements(),this.copyNewHeadProvisionalElements()},o.prototype.replaceBody=function(){var t;return t=this.relocateCurrentBodyPermanentElements(),this.activateNewBodyScriptElements(),this.assignNewBody(),this.replacePlaceholderElementsWithClonedPermanentElements(t)},o.prototype.shouldRender=function(){return this.newSnapshot.isVisitable()&&this.trackedElementsAreIdentical()},o.prototype.trackedElementsAreIdentical=function(){return this.currentHeadDetails.getTrackedElementSignature()===this.newHeadDetails.getTrackedElementSignature()},o.prototype.copyNewHeadStylesheetElements=function(){var t,e,r,n,o;for(n=this.getNewHeadStylesheetElements(),o=[],e=0,r=n.length;r>e;e++)t=n[e],o.push(document.head.appendChild(t));return o},o.prototype.copyNewHeadScriptElements=function(){var t,e,r,n,o;for(n=this.getNewHeadScriptElements(),o=[],e=0,r=n.length;r>e;e++)t=n[e],o.push(document.head.appendChild(this.createScriptElement(t)));return o},o.prototype.removeCurrentHeadProvisionalElements=function(){var t,e,r,n,o;for(n=this.getCurrentHeadProvisionalElements(),o=[],e=0,r=n.length;r>e;e++)t=n[e],o.push(document.head.removeChild(t));return o},o.prototype.copyNewHeadProvisionalElements=function(){var t,e,r,n,o;for(n=this.getNewHeadProvisionalElements(),o=[],e=0,r=n.length;r>e;e++)t=n[e],o.push(document.head.appendChild(t));return o},o.prototype.relocateCurrentBodyPermanentElements=function(){var e,n,o,i,s,a,u;for(a=this.getCurrentBodyPermanentElements(),u=[],e=0,n=a.length;n>e;e++)i=a[e],s=t(i),o=this.newSnapshot.getPermanentElementById(i.id),r(i,s.element),r(o,i),u.push(s);return u},o.prototype.replacePlaceholderElementsWithClonedPermanentElements=function(t){var e,n,o,i,s,a,u;for(u=[],o=0,i=t.length;i>o;o++)a=t[o],n=a.element,s=a.permanentElement,e=s.cloneNode(!0),u.push(r(n,e));return u},o.prototype.activateNewBodyScriptElements=function(){var t,e,n,o,i,s;for(i=this.getNewBodyScriptElements(),s=[],e=0,o=i.length;o>e;e++)n=i[e],t=this.createScriptElement(n),s.push(r(n,t));return s},o.prototype.assignNewBody=function(){return document.body=this.newBody},o.prototype.focusFirstAutofocusableElement=function(){var t;return null!=(t=this.newSnapshot.findFirstAutofocusableElement())?t.focus():void 0},o.prototype.getNewHeadStylesheetElements=function(){return this.newHeadDetails.getStylesheetElementsNotInDetails(this.currentHeadDetails)},o.prototype.getNewHeadScriptElements=function(){return this.newHeadDetails.getScriptElementsNotInDetails(this.currentHeadDetails)},o.prototype.getCurrentHeadProvisionalElements=function(){return this.currentHeadDetails.getProvisionalElements()},o.prototype.getNewHeadProvisionalElements=function(){return this.newHeadDetails.getProvisionalElements()},o.prototype.getCurrentBodyPermanentElements=function(){return this.currentSnapshot.getPermanentElementsPresentInSnapshot(this.newSnapshot)},o.prototype.getNewBodyScriptElements=function(){return this.newBody.querySelectorAll("script")},o}(e.Renderer),t=function(t){var e;return e=document.createElement("meta"),e.setAttribute("name","turbolinks-permanent-placeholder"),e.setAttribute("content",t.id),{element:e,permanentElement:t}},r=function(t,e){var r;return(r=t.parentNode)?r.replaceChild(e,t):void 0}}.call(this),function(){var t=function(t,e){function n(){this.constructor=t}for(var o in e)r.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;e.ErrorRenderer=function(e){function r(t){var e;e=document.createElement("html"),e.innerHTML=t,this.newHead=e.querySelector("head"),this.newBody=e.querySelector("body")}return t(r,e),r.prototype.render=function(t){return this.renderView(function(e){return function(){return e.replaceHeadAndBody(),e.activateBodyScriptElements(),t()}}(this))},r.prototype.replaceHeadAndBody=function(){var t,e;return e=document.head,t=document.body,e.parentNode.replaceChild(this.newHead,e),t.parentNode.replaceChild(this.newBody,t)},r.prototype.activateBodyScriptElements=function(){var t,e,r,n,o,i;for(n=this.getScriptElements(),i=[],e=0,r=n.length;r>e;e++)o=n[e],t=this.createScriptElement(o),i.push(o.parentNode.replaceChild(t,o));return i},r.prototype.getScriptElements=function(){return document.documentElement.querySelectorAll("script")},r}(e.Renderer)}.call(this),function(){e.View=function(){function t(t){this.delegate=t,this.htmlElement=document.documentElement}return t.prototype.getRootLocation=function(){return this.getSnapshot().getRootLocation()},t.prototype.getElementForAnchor=function(t){return this.getSnapshot().getElementForAnchor(t)},t.prototype.getSnapshot=function(){return e.Snapshot.fromHTMLElement(this.htmlElement)},t.prototype.render=function(t,e){var r,n,o;return o=t.snapshot,r=t.error,n=t.isPreview,this.markAsPreview(n),null!=o?this.renderSnapshot(o,n,e):this.renderError(r,e)},t.prototype.markAsPreview=function(t){return t?this.htmlElement.setAttribute("data-turbolinks-preview",""):this.htmlElement.removeAttribute("data-turbolinks-preview")},t.prototype.renderSnapshot=function(t,r,n){return e.SnapshotRenderer.render(this.delegate,n,this.getSnapshot(),e.Snapshot.wrap(t),r)},t.prototype.renderError=function(t,r){return e.ErrorRenderer.render(this.delegate,r,t)},t}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.ScrollManager=function(){function r(r){this.delegate=r,this.onScroll=t(this.onScroll,this),this.onScroll=e.throttle(this.onScroll)}return r.prototype.start=function(){return this.started?void 0:(addEventListener("scroll",this.onScroll,!1),this.onScroll(),this.started=!0)},r.prototype.stop=function(){return this.started?(removeEventListener("scroll",this.onScroll,!1),this.started=!1):void 0},r.prototype.scrollToElement=function(t){return t.scrollIntoView()},r.prototype.scrollToPosition=function(t){var e,r;return e=t.x,r=t.y,window.scrollTo(e,r)},r.prototype.onScroll=function(t){return this.updatePosition({x:window.pageXOffset,y:window.pageYOffset})},r.prototype.updatePosition=function(t){var e;return this.position=t,null!=(e=this.delegate)?e.scrollPositionChanged(this.position):void 0},r}()}.call(this),function(){e.SnapshotCache=function(){function t(t){this.size=t,this.keys=[],this.snapshots={}}var r;return t.prototype.has=function(t){var e;return e=r(t),e in this.snapshots},t.prototype.get=function(t){var e;if(this.has(t))return e=this.read(t),this.touch(t),e},t.prototype.put=function(t,e){return this.write(t,e),this.touch(t),e},t.prototype.read=function(t){var e;return e=r(t),this.snapshots[e]},t.prototype.write=function(t,e){var n;return n=r(t),this.snapshots[n]=e},t.prototype.touch=function(t){var e,n;return n=r(t),e=this.keys.indexOf(n),e>-1&&this.keys.splice(e,1),this.keys.unshift(n),this.trim()},t.prototype.trim=function(){var t,e,r,n,o;for(n=this.keys.splice(this.size),o=[],t=0,r=n.length;r>t;t++)e=n[t],o.push(delete this.snapshots[e]);return o},r=function(t){return e.Location.wrap(t).toCacheKey()},t}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.Visit=function(){function r(r,n,o){this.controller=r,this.action=o,this.performScroll=t(this.performScroll,this),this.identifier=e.uuid(),this.location=e.Location.wrap(n),this.adapter=this.controller.adapter,this.state="initialized",this.timingMetrics={}}var n;return r.prototype.start=function(){return"initialized"===this.state?(this.recordTimingMetric("visitStart"),this.state="started",this.adapter.visitStarted(this)):void 0},r.prototype.cancel=function(){var t;return"started"===this.state?(null!=(t=this.request)&&t.cancel(),this.cancelRender(),this.state="canceled"):void 0},r.prototype.complete=function(){var t;return"started"===this.state?(this.recordTimingMetric("visitEnd"),this.state="completed","function"==typeof(t=this.adapter).visitCompleted&&t.visitCompleted(this),this.controller.visitCompleted(this)):void 0},r.prototype.fail=function(){var t;return"started"===this.state?(this.state="failed","function"==typeof(t=this.adapter).visitFailed?t.visitFailed(this):void 0):void 0},r.prototype.changeHistory=function(){var t,e;return this.historyChanged?void 0:(t=this.location.isEqualTo(this.referrer)?"replace":this.action,e=n(t),this.controller[e](this.location,this.restorationIdentifier),this.historyChanged=!0)},r.prototype.issueRequest=function(){return this.shouldIssueRequest()&&null==this.request?(this.progress=0,this.request=new e.HttpRequest(this,this.location,this.referrer),this.request.send()):void 0},r.prototype.getCachedSnapshot=function(){var t;return!(t=this.controller.getCachedSnapshotForLocation(this.location))||null!=this.location.anchor&&!t.hasAnchor(this.location.anchor)||"restore"!==this.action&&!t.isPreviewable()?void 0:t},r.prototype.hasCachedSnapshot=function(){return null!=this.getCachedSnapshot()},r.prototype.loadCachedSnapshot=function(){var t,e;return(e=this.getCachedSnapshot())?(t=this.shouldIssueRequest(),this.render(function(){var r;return this.cacheSnapshot(),this.controller.render({snapshot:e,isPreview:t},this.performScroll),"function"==typeof(r=this.adapter).visitRendered&&r.visitRendered(this),t?void 0:this.complete()})):void 0},r.prototype.loadResponse=function(){return null!=this.response?this.render(function(){var t,e;return this.cacheSnapshot(),this.request.failed?(this.controller.render({error:this.response},this.performScroll),"function"==typeof(t=this.adapter).visitRendered&&t.visitRendered(this),this.fail()):(this.controller.render({snapshot:this.response},this.performScroll),"function"==typeof(e=this.adapter).visitRendered&&e.visitRendered(this),this.complete())}):void 0},r.prototype.followRedirect=function(){return this.redirectedToLocation&&!this.followedRedirect?(this.location=this.redirectedToLocation,this.controller.replaceHistoryWithLocationAndRestorationIdentifier(this.redirectedToLocation,this.restorationIdentifier),this.followedRedirect=!0):void 0},r.prototype.requestStarted=function(){var t;return this.recordTimingMetric("requestStart"),"function"==typeof(t=this.adapter).visitRequestStarted?t.visitRequestStarted(this):void 0},r.prototype.requestProgressed=function(t){var e;return this.progress=t,"function"==typeof(e=this.adapter).visitRequestProgressed?e.visitRequestProgressed(this):void 0},r.prototype.requestCompletedWithResponse=function(t,r){return this.response=t,null!=r&&(this.redirectedToLocation=e.Location.wrap(r)),this.adapter.visitRequestCompleted(this)},r.prototype.requestFailedWithStatusCode=function(t,e){return this.response=e,this.adapter.visitRequestFailedWithStatusCode(this,t)},r.prototype.requestFinished=function(){var t;return this.recordTimingMetric("requestEnd"),"function"==typeof(t=this.adapter).visitRequestFinished?t.visitRequestFinished(this):void 0},r.prototype.performScroll=function(){return this.scrolled?void 0:("restore"===this.action?this.scrollToRestoredPosition()||this.scrollToTop():this.scrollToAnchor()||this.scrollToTop(),this.scrolled=!0)},r.prototype.scrollToRestoredPosition=function(){var t,e;return t=null!=(e=this.restorationData)?e.scrollPosition:void 0,null!=t?(this.controller.scrollToPosition(t),!0):void 0},r.prototype.scrollToAnchor=function(){return null!=this.location.anchor?(this.controller.scrollToAnchor(this.location.anchor),!0):void 0},r.prototype.scrollToTop=function(){return this.controller.scrollToPosition({x:0,y:0})},r.prototype.recordTimingMetric=function(t){var e;return null!=(e=this.timingMetrics)[t]?e[t]:e[t]=(new Date).getTime()},r.prototype.getTimingMetrics=function(){return e.copyObject(this.timingMetrics)},n=function(t){switch(t){case"replace":return"replaceHistoryWithLocationAndRestorationIdentifier";case"advance":case"restore":return"pushHistoryWithLocationAndRestorationIdentifier"}},r.prototype.shouldIssueRequest=function(){return"restore"===this.action?!this.hasCachedSnapshot():!0},r.prototype.cacheSnapshot=function(){return this.snapshotCached?void 0:(this.controller.cacheSnapshot(),this.snapshotCached=!0)},r.prototype.render=function(t){return this.cancelRender(),this.frame=requestAnimationFrame(function(e){return function(){return e.frame=null,t.call(e)}}(this))},r.prototype.cancelRender=function(){return this.frame?cancelAnimationFrame(this.frame):void 0},r}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.Controller=function(){function r(){this.clickBubbled=t(this.clickBubbled,this),this.clickCaptured=t(this.clickCaptured,this),this.pageLoaded=t(this.pageLoaded,this),this.history=new e.History(this),this.view=new e.View(this),this.scrollManager=new e.ScrollManager(this),this.restorationData={},this.clearCache(),this.setProgressBarDelay(500)}return r.prototype.start=function(){return e.supported&&!this.started?(addEventListener("click",this.clickCaptured,!0),addEventListener("DOMContentLoaded",this.pageLoaded,!1),this.scrollManager.start(),this.startHistory(),this.started=!0,this.enabled=!0):void 0},r.prototype.disable=function(){return this.enabled=!1},r.prototype.stop=function(){return this.started?(removeEventListener("click",this.clickCaptured,!0),removeEventListener("DOMContentLoaded",this.pageLoaded,!1),this.scrollManager.stop(),this.stopHistory(),this.started=!1):void 0},r.prototype.clearCache=function(){return this.cache=new e.SnapshotCache(10)},r.prototype.visit=function(t,r){var n,o;return null==r&&(r={}),t=e.Location.wrap(t),this.applicationAllowsVisitingLocation(t)?this.locationIsVisitable(t)?(n=null!=(o=r.action)?o:"advance",this.adapter.visitProposedToLocationWithAction(t,n)):window.location=t:void 0},r.prototype.startVisitToLocationWithAction=function(t,r,n){var o;return e.supported?(o=this.getRestorationDataForIdentifier(n),this.startVisit(t,r,{restorationData:o})):window.location=t},r.prototype.setProgressBarDelay=function(t){return this.progressBarDelay=t},r.prototype.startHistory=function(){return this.location=e.Location.wrap(window.location),this.restorationIdentifier=e.uuid(),this.history.start(),this.history.replace(this.location,this.restorationIdentifier)},r.prototype.stopHistory=function(){return this.history.stop()},r.prototype.pushHistoryWithLocationAndRestorationIdentifier=function(t,r){return this.restorationIdentifier=r,this.location=e.Location.wrap(t),this.history.push(this.location,this.restorationIdentifier)},r.prototype.replaceHistoryWithLocationAndRestorationIdentifier=function(t,r){return this.restorationIdentifier=r,this.location=e.Location.wrap(t),this.history.replace(this.location,this.restorationIdentifier)},r.prototype.historyPoppedToLocationWithRestorationIdentifier=function(t,r){var n;return this.restorationIdentifier=r,this.enabled?(n=this.getRestorationDataForIdentifier(this.restorationIdentifier),this.startVisit(t,"restore",{restorationIdentifier:this.restorationIdentifier,restorationData:n,historyChanged:!0}),this.location=e.Location.wrap(t)):this.adapter.pageInvalidated()},r.prototype.getCachedSnapshotForLocation=function(t){var e;return null!=(e=this.cache.get(t))?e.clone():void 0},r.prototype.shouldCacheSnapshot=function(){return this.view.getSnapshot().isCacheable(); +// },r.prototype.cacheSnapshot=function(){var t,r;return this.shouldCacheSnapshot()?(this.notifyApplicationBeforeCachingSnapshot(),r=this.view.getSnapshot(),t=this.lastRenderedLocation,e.defer(function(e){return function(){return e.cache.put(t,r.clone())}}(this))):void 0},r.prototype.scrollToAnchor=function(t){var e;return(e=this.view.getElementForAnchor(t))?this.scrollToElement(e):this.scrollToPosition({x:0,y:0})},r.prototype.scrollToElement=function(t){return this.scrollManager.scrollToElement(t)},r.prototype.scrollToPosition=function(t){return this.scrollManager.scrollToPosition(t)},r.prototype.scrollPositionChanged=function(t){var e;return e=this.getCurrentRestorationData(),e.scrollPosition=t},r.prototype.render=function(t,e){return this.view.render(t,e)},r.prototype.viewInvalidated=function(){return this.adapter.pageInvalidated()},r.prototype.viewWillRender=function(t){return this.notifyApplicationBeforeRender(t)},r.prototype.viewRendered=function(){return this.lastRenderedLocation=this.currentVisit.location,this.notifyApplicationAfterRender()},r.prototype.pageLoaded=function(){return this.lastRenderedLocation=this.location,this.notifyApplicationAfterPageLoad()},r.prototype.clickCaptured=function(){return removeEventListener("click",this.clickBubbled,!1),addEventListener("click",this.clickBubbled,!1)},r.prototype.clickBubbled=function(t){var e,r,n;return this.enabled&&this.clickEventIsSignificant(t)&&(r=this.getVisitableLinkForNode(t.target))&&(n=this.getVisitableLocationForLink(r))&&this.applicationAllowsFollowingLinkToLocation(r,n)?(t.preventDefault(),e=this.getActionForLink(r),this.visit(n,{action:e})):void 0},r.prototype.applicationAllowsFollowingLinkToLocation=function(t,e){var r;return r=this.notifyApplicationAfterClickingLinkToLocation(t,e),!r.defaultPrevented},r.prototype.applicationAllowsVisitingLocation=function(t){var e;return e=this.notifyApplicationBeforeVisitingLocation(t),!e.defaultPrevented},r.prototype.notifyApplicationAfterClickingLinkToLocation=function(t,r){return e.dispatch("turbolinks:click",{target:t,data:{url:r.absoluteURL},cancelable:!0})},r.prototype.notifyApplicationBeforeVisitingLocation=function(t){return e.dispatch("turbolinks:before-visit",{data:{url:t.absoluteURL},cancelable:!0})},r.prototype.notifyApplicationAfterVisitingLocation=function(t){return e.dispatch("turbolinks:visit",{data:{url:t.absoluteURL}})},r.prototype.notifyApplicationBeforeCachingSnapshot=function(){return e.dispatch("turbolinks:before-cache")},r.prototype.notifyApplicationBeforeRender=function(t){return e.dispatch("turbolinks:before-render",{data:{newBody:t}})},r.prototype.notifyApplicationAfterRender=function(){return e.dispatch("turbolinks:render")},r.prototype.notifyApplicationAfterPageLoad=function(t){return null==t&&(t={}),e.dispatch("turbolinks:load",{data:{url:this.location.absoluteURL,timing:t}})},r.prototype.startVisit=function(t,e,r){var n;return null!=(n=this.currentVisit)&&n.cancel(),this.currentVisit=this.createVisit(t,e,r),this.currentVisit.start(),this.notifyApplicationAfterVisitingLocation(t)},r.prototype.createVisit=function(t,r,n){var o,i,s,a,u;return i=null!=n?n:{},a=i.restorationIdentifier,s=i.restorationData,o=i.historyChanged,u=new e.Visit(this,t,r),u.restorationIdentifier=null!=a?a:e.uuid(),u.restorationData=e.copyObject(s),u.historyChanged=o,u.referrer=this.location,u},r.prototype.visitCompleted=function(t){return this.notifyApplicationAfterPageLoad(t.getTimingMetrics())},r.prototype.clickEventIsSignificant=function(t){return!(t.defaultPrevented||t.target.isContentEditable||t.which>1||t.altKey||t.ctrlKey||t.metaKey||t.shiftKey)},r.prototype.getVisitableLinkForNode=function(t){return this.nodeIsVisitable(t)?e.closest(t,"a[href]:not([target]):not([download])"):void 0},r.prototype.getVisitableLocationForLink=function(t){var r;return r=new e.Location(t.getAttribute("href")),this.locationIsVisitable(r)?r:void 0},r.prototype.getActionForLink=function(t){var e;return null!=(e=t.getAttribute("data-turbolinks-action"))?e:"advance"},r.prototype.nodeIsVisitable=function(t){var r;return(r=e.closest(t,"[data-turbolinks]"))?"false"!==r.getAttribute("data-turbolinks"):!0},r.prototype.locationIsVisitable=function(t){return t.isPrefixedBy(this.view.getRootLocation())&&t.isHTML()},r.prototype.getCurrentRestorationData=function(){return this.getRestorationDataForIdentifier(this.restorationIdentifier)},r.prototype.getRestorationDataForIdentifier=function(t){var e;return null!=(e=this.restorationData)[t]?e[t]:e[t]={}},r}()}.call(this),function(){!function(){var t,e;if((t=e=document.currentScript)&&!e.hasAttribute("data-turbolinks-suppress-warning"))for(;t=t.parentNode;)if(t===document.body)return console.warn("You are loading Turbolinks from a + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + +
+ + +
+ + + + + +
+ + +
+ + +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+ +
+
+ + + +
+
+ + + + + + + + +

快速入门

+ +

1 快速部署

+
+
    +
  • 支持主流 Linux 发行版本(基于 Debian / RedHat,包括国产操作系统)
  • +
  • 推荐使用 离线安装包 进行部署。
  • +
+

将下载的安装包上传至服务器并解压,在安装包目录里执行以下脚本进行快速安装: +

bash install.sh
+

+

安装完成后,通过浏览器访问 http://目标服务器 IP 地址:8080,并使用默认的管理员用户和密码登录 MaxKB。

+
用户名:admin
+
+默认密码:MaxKB@123..
+
+
+

2 界面介绍

+
+

进入 MaxKB 主界面后可以看到界面上方导航栏,包含应用、知识库、工具、模型四大模块。

+
    +
  • +

    模型:支持对接本地、国内、国外主流大模型,涵盖文本生成、语音识别、视觉识别等多种类型,满足多场景需求。

    +
  • +
  • +

    工具:提供内置及自定义函数,用于数据获取、逻辑判断、信息提取等操作,创建后的工具可在应用编排中调用。

    +
  • +
  • +

    知识库:创建和管理知识库,包括上传离线文档、Web 站点、飞书文档等,为问答对话提供知识来源,对知识进行统一管理,并助力智能问答。

    +
  • +
  • +

    应用:提供预配置模板和组件,可快速创建基础问答应用,或对复杂业务流程进行高级编排,打造专属 AI 助手。

    +
  • +
+
+

导航栏

+

3 快速上手

+
+

MaxKB 通过接入大模型、构建知识库、创建应用,三步拥有专属的 AI 助手。同时支持快速嵌入各类系统,零编码快速集成,让现有系统瞬间拥有 AI 能力。

+
+

操作流程

+
+

下面以通用知识库为例,通过公有模型服务阿里云百炼(本地模型部署操作,例如,DeepSeek 部署,请参考使用 1Panel 开源面板快速部署DeepSeek-R1),快速创建智能问答应用并发布说明具体操作。

+
+

3.1 添加模型

+
+

登录 MaxKB 系统后, 打开【模型】页面,在供应商列表中选择【阿里云百炼】,然后点击【添加模型】,进入模型配置表单配置参数如下:

+
    +
  • 模型名称:MaxKB 中自定义的模型名称。
  • +
  • 模型类型:大语言模型。
  • +
  • 基础模型:阿里云百炼支持的 LLM 模型名称,下拉选项是常用的一些大语言模型名称,支持自定义输入。
  • +
  • API Key:阿里云 DashScope 灵积模型服务 API Key管理中创建和查看。
  • +
+
+

添加模型 APIkey

+
+

不同的平台参数要求不同,其它供应商模型配置添加详情见各模型对接详细说明。

+
+

3.2 创建知识库

+
+

打开【知识库】页面,点击【创建知识库】,输入知识库名称、知识库描述、选择向量模型,并设置知识库类型为通用型,然后将离线文档通过拖拽方式或选择文件上传方式进行上传。

+
+
+

上传文档要求:

+
    +
  • 文本文件:Markdown、TXT、PDF、DOCX、HTML、XLS、XLSX、CSV、ZIP;
  • +
  • 表格格式:Excel、CSV;
  • +
  • QA 问答对:Excel、CSV;
  • +
  • 默认每次最多上传 50 个文件,每个文件不超过 100 MB,可配置,上传文件数量最多为 1000,单个文档最大 1000 MB;
  • +
  • 支持选择文件夹,上传文件夹下符合格式要求的文件。
  • +
+

文档规范建议:

+
    +
  • 规范分段标识:离线文档的分段标识要有一定规范,否则拆分出来的段落不规整。
  • +
  • 段落要完整:一个分段中最好能描述一个完整的内容。
  • +
+
+

创建通用知识库

+
+

MaxKB 支持智能分段和高级分段两种分段方式。

+
    +
  • +

    智能分段:按照 Markdown 格式进行逐级下钻式分段(最多支持 6 级标题),每段最大字符数为 4096 个;

    +
  • +
  • +

    高级分段:支持自定义设置分段标识符、分段长度及自动清洗。分段标识还支持使用正则表达式处理复杂结构文档。

    +
  • +
+

导入时添加分段标题为关联问题,勾选后会把所有分段的标题设置为分段的关联问题。

+
+

编辑分段

+
+

点击【创建并导入】后,系统后台会对文档进行自动分段 、存储、向量化处理操作,执行完成后在知识库文档列表中各个文件状态显示为【成功】。

+
+

文档列表

+

分段列表

+

3.3 创建应用

+
+

点击【创建】,选择应用类型,输入应用名称后点击【创建】。

+
    +
  • 简单配置:提供基础的功能和设置选项,可满足大多数基本的问答需求,适用于需要快速上线智能体应用。
  • +
  • 高级编排:通过基础组件、工具以及应用嵌套进行功能和逻辑的编排,设计工作流程,满足各类复杂业务场景的需求。
  • +
+
+

创建应用

+
+

应用创建完成,进入【简单配置】配置应用的设置页面,左侧为应用信息,右侧为调试预览界面。

+
    +
  • 名称:用户提问时对话框的标题和名字。
  • +
  • 描述:对应用场景及用途的描述。
  • +
  • AI 模型:在【系统设置】-【模型管理】中添加的大语言模型。
  • +
  • 系统角色:AI 模型在交互中被预设的身份、功能以及行为边界。
  • +
  • 提示词:系统默认有智能知识库的提示词,用户可以自定义通过调整提示词内容,引导大模型聊天方向。可对无引用知识库和引用知识库两种情况分别设置不同的提示词。
  • +
  • 历史聊天记录:大模型提交当前会话中最后 N 条对话内容,如果为 0,则仅向大模型提交当前问题。
  • +
  • 关联知识库:用户提问后将在关联的知识库中检索分段。
  • +
  • 开场白:用户打开对话时,系统弹出的问候语。支持 Markdown 格式;[-]后的内容为快捷问题,一行一个。
  • +
  • 输出思考:对大语言模型的思考过程是否输出进行配置。
  • +
  • 语音输入:开启后将支持语音方式进行提问,需要语音识别模型支持。
  • +
  • 语音播放:开启后可以通过语音进行播放回答,可以通过浏览器播放,也可以通选择语音合成模型。
  • +
+

应用信息设置完成后,可以在右侧调试预览中进行测试验证,调试预览中的提问内容不计入对话日志。

+
+

应用设置

+
+

知识库参数设置详细说明:

+
    +
  • +

    检索模式

    +
      +
    • 向量检索:使用向量模型通过向量距离计算与用户问题最相似的文本分段;
    • +
    • 全文检索:通过关键词检索,返回包含关键词最多的文本分段;
    • +
    • 混合检索:同时执行全文检索和向量检索,再进行重排序,从两类查询结果中选择匹配用户问题的最佳结果。
    • +
    +
  • +
  • +

    相似度: 相似度越高代表问题和分段的相关性越强。

    +
  • +
  • +

    引用分段数 TOP: 提问时按相似度携带 N 个分段生成提示词询问 LLM 模型。

    +
  • +
  • +

    最多引用字符数: 引用分段内容设置最大字符数,超过时则截断。

    +
  • +
  • +

    无引用知识库处理

    +
      +
    • 继续向 AI 模型提问:即没有命中知识库分段时继续由大模型提问,由大模型自行回答,这有可能造成幻觉。
    • +
    • 指定回复内容:当没有命中知识库分段时可以指定回复内容,进一步引导。
    • +
    +
  • +
  • +

    问题优化: 开启后对用户提出的问题先进行一次 LLM 优化处理,然后根据问题优化后的结果在知识库中进行检索。

    +
  • +
+
+

应用知识库参数设置

+
+

保存设置并发布后,在应用列表页面的概览页面点击【去对话】或在浏览器中复制公开访问链接进入问答页面进行提问。

+
+

演示预览

+

3.4 应用集成

+
+

MaxKB 应用支持零编码快速嵌入第三方 Web 系统。

+

在应用概览页面,点击【嵌入第三方】,复制对应的嵌入代码,以全屏模式或浮窗模式嵌入到第三方系统中,嵌入完成后便可在第三方系统中进行问答。

+
+

嵌入第三方

+
+

MaxKB 应用也支持接入企业微信、公众号、钉钉和飞书等移动端应用,详细说明见:X-Pack功能-应用接入

+
+ + + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/search/search_index.json b/v2/search/search_index.json new file mode 100644 index 00000000..7d92b0b6 --- /dev/null +++ b/v2/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["en","ja"],"separator":"[\\s\\-\\.]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u4ea7\u54c1\u4ecb\u7ecd","text":"

MaxKB = Max Knowledge Brain\uff0c\u662f\u4e00\u6b3e\u5f3a\u5927\u6613\u7528\u7684\u4f01\u4e1a\u7ea7\u667a\u80fd\u4f53\u5e73\u53f0\uff0c\u81f4\u529b\u4e8e\u89e3\u51b3\u4f01\u4e1a AI \u843d\u5730\u9762\u4e34\u7684\u6280\u672f\u95e8\u69db\u9ad8\u3001\u90e8\u7f72\u6210\u672c\u9ad8\u3001\u8fed\u4ee3\u5468\u671f\u957f\u7b49\u95ee\u9898\uff0c\u52a9\u529b\u4f01\u4e1a\u5728\u4eba\u5de5\u667a\u80fd\u65f6\u4ee3\u8d62\u5f97\u5148\u673a\u3002

\u79c9\u627f\u201c\u5f00\u7bb1\u5373\u7528\uff0c\u4f34\u968f\u6210\u957f\u201d\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0cMaxKB\u652f\u6301\u4f01\u4e1a\u5feb\u901f\u63a5\u5165\u4e3b\u6d41\u5927\u6a21\u578b\uff0c\u9ad8\u6548\u6784\u5efa\u4e13\u5c5e\u77e5\u8bc6\u5e93\uff0c\u5e76\u4e14\u63d0\u4f9b\u4ece\u57fa\u7840\u77e5\u8bc6\u95ee\u7b54\uff08RAG\uff09\u3001\u590d\u6742\u4e1a\u52a1\u6d41\u7a0b\u81ea\u52a8\u5316\uff08Workflow\uff0c\u5de5\u4f5c\u6d41\uff09\u5230\u667a\u80fd\u4f53\uff08Agent\uff09\u7684\u6e10\u8fdb\u5f0f\u5347\u7ea7\u8def\u5f84\uff0c\u6709\u6548\u8d4b\u80fd\u667a\u80fd\u5ba2\u670d\u3001\u667a\u6167\u529e\u516c\u7b49\u591a\u79cd\u5e94\u7528\u573a\u666f\u3002

"},{"location":"#1","title":"1 \u5de5\u4f5c\u539f\u7406","text":""},{"location":"#2","title":"2 \u4ea7\u54c1\u4f18\u52bf","text":"
  • RAG \u68c0\u7d22\u589e\u5f3a \u652f\u6301\u76f4\u63a5\u4e0a\u4f20\u6587\u6863 / \u81ea\u52a8\u722c\u53d6\u5728\u7ebf\u6587\u6863\uff0c\u652f\u6301\u6587\u672c\u81ea\u52a8\u62c6\u5206\u3001\u5411\u91cf\u5316\u548c RAG\uff08\u68c0\u7d22\u589e\u5f3a\u751f\u6210\uff09\uff0c\u6709\u6548\u51cf\u5c11\u5927\u6a21\u578b\u5e7b\u89c9\uff0c\u667a\u80fd\u95ee\u7b54\u4ea4\u4e92\u4f53\u9a8c\u597d\uff1b

  • \u7075\u6d3b\u7f16\u6392 \u5185\u7f6e\u5f3a\u5927\u7684\u5de5\u4f5c\u6d41\u5f15\u64ce\u3001\u51fd\u6570\u5e93\u548c MCP \u5de5\u5177\u8c03\u7528\u80fd\u529b\uff0c\u652f\u6301\u7f16\u6392 AI \u5de5\u4f5c\u8fc7\u7a0b\uff0c\u6ee1\u8db3\u590d\u6742\u4e1a\u52a1\u573a\u666f\u4e0b\u7684\u9700\u6c42\uff1b

  • \u65e0\u7f1d\u5d4c\u5165 \u652f\u6301\u96f6\u7f16\u7801\u5feb\u901f\u5d4c\u5165\u5230\u7b2c\u4e09\u65b9\u4e1a\u52a1\u7cfb\u7edf\uff0c\u8ba9\u5df2\u6709\u7cfb\u7edf\u5feb\u901f\u62e5\u6709\u667a\u80fd\u95ee\u7b54\u80fd\u529b\uff0c\u63d0\u9ad8\u7528\u6237\u6ee1\u610f\u5ea6\uff1b

  • \u6a21\u578b\u4e2d\u7acb \u652f\u6301\u5bf9\u63a5\u5404\u79cd\u5927\u6a21\u578b\uff0c\u5305\u62ec\u672c\u5730\u79c1\u6709\u5927\u6a21\u578b\uff08Llama 3 / Qwen 2 \u7b49\uff09\u3001\u56fd\u5185\u516c\u5171\u5927\u6a21\u578b\uff08DeepSeek / SILICONFLOW / \u901a\u4e49\u5343\u95ee / \u817e\u8baf\u6df7\u5143 / \u5b57\u8282\u8c46\u5305 / \u767e\u5ea6\u5343\u5e06 / \u667a\u8c31 AI / Kimi \u7b49\uff09\u548c\u56fd\u5916\u516c\u5171\u5927\u6a21\u578b\uff08OpenAI / Azure OpenAI / Anthropic / Gemini \u7b49\uff09\u3002

"},{"location":"#3","title":"3 \u754c\u9762\u5c55\u793a","text":""},{"location":"#4","title":"4 \u6848\u4f8b\u5c55\u793a","text":"

MaxKB \u81ea\u53d1\u5e03\u4ee5\u6765\uff0c\u65e5\u5747\u5b89\u88c5\u4e0b\u8f7d\u8d85\u8fc7 1000 \u6b21\uff0c\u88ab\u5e7f\u6cdb\u5e94\u7528\u4e8e\u667a\u80fd\u5ba2\u670d\u3001\u4f01\u4e1a\u5185\u90e8\u77e5\u8bc6\u5e93\u3001\u5b66\u672f\u7814\u7a76\u4e0e\u6559\u80b2\u7b49\u573a\u666f\uff0c\u5178\u578b\u5e94\u7528\u6848\u4f8b\u8be6\u60c5\u89c1\u5982\u4e0b\u94fe\u63a5\uff1a

  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u4e2d\u56fd\u519c\u4e1a\u5927\u5b66-\u5c0f\u9e49\u54e5
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u4e1c\u5317\u8d22\u7ecf\u5927\u5b66-\u5c0f\u94f6\u674f
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u91cd\u5e86\u4ea4\u901a\u5927\u5b66-\u6e1d\u5c0f\u4ea4
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u5e7f\u897f\u5927\u5b66
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u5357\u4eac\u4e2d\u533b\u836f\u5927\u5b66
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u9ad8\u6821\u884c\u653f\u7ba1\u7406AI\u5c0f\u52a9\u624b
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u4e2d\u94c1\u6c34\u52a1
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u89e3\u653e\u519b\u603b\u533b\u9662
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u4e2d\u6838\u897f\u4eea\u7814\u7a76\u9662-\u897f\u4eea\u777f\u7b54
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u897f\u5b89\u56fd\u9645\u533b\u9662\u4e2d\u5fc3\u533b\u9662-\u56fd\u533b\u5c0f\u52a9
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u6df1\u5733\u5927\u5b66\u9644\u5c5e\u534e\u5357\u533b\u9662-\u533b\u7597\u7248\u201c\u77e5\u8bc6\u6570\u636e\u5e93\u52a9\u624b\u201d
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u751f\u7269\u533b\u836fAI\u5ba2\u670d\u667a\u80fd\u4f53\u9a8c!
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u628a\u533b\u7597\u884c\u4e1a\u77e5\u8bc6\u8f6c\u5316\u4e3a\u77e5\u8bc6\u5e93\u95ee\u7b54\u52a9\u624b\uff01
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u6df1\u5733\u798f\u7530\u516c\u8bc1\u5904 AI \u52a9\u624b
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u65e0\u9521\u5e02\u6570\u636e\u5c40
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u5e7f\u897f\u8d28\u68c0\u9662 AI\u5c0f\u8d28
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u6df1\u5733\u8054\u4ea4\u6240-\u6df1\u5c0f\u8054AI\u52a9\u624b
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u5b89\u5fbd\u4ea4\u6613\u96c6\u56e2\u53d1\u5e03AI\u62db\u6807\u6587\u4ef6\u7f16\u5ba1\u7cfb\u7edf
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u6df1\u5733\u901a\u5f00\u542fDeep Seek\u667a\u80fd\u5e94\u7528\u65b0\u7bc7\u7ae0
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\"\u7545\u884c\u5357\u901a\"\u667a\u80fd\u5ba2\u670d
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u6d4e\u5357\u5730\u94c1-\u501f\u52a9 DeepSeek\u5168\u9762\u63a5\u5165\uff01\u201cAI+\u8f68\u9053\u201d\u8ba9\u5e02\u6c11\u51fa\u884c\u66f4\u667a\u80fd
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u5e7f\u5dde\u6e2f-\u501f\u52a9 DeepSeek\u5f00\u6e90\u5927\u6a21\u578b \u8d4b\u80fd\u6e2f\u53e3\u8bbe\u5907\u7ba1\u7406
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u56db\u5ddd\u822a\u7a7a-\u5ddd\u822aAI\u52a9\u624b\u6765\u62a5\u5230\uff01
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u534e\u83b1\u58eb\u667a\u80fdAI\u5ba2\u670d\u52a9\u624b\u4e0a\u7ebf\u5566\uff01
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u4f1a\u5c55AI\u667a\u80fd\u5ba2\u670d\u4f53\u9a8c
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u5b69\u5b50\u8981\u4e0a\u5e7c\u513f\u56ed\u4e86\uff0cAI \u667a\u80fd\u52a9\u624b\u62e9\u6821\u597d\u5e2e\u624b
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u4ea7\u54c1\u4f7f\u7528\u6307\u5357AI\u52a9\u624b\uff0c\u65b0\u624b\u5c0f\u767d\u4e5f\u80fd\u8f7b\u677e\u641e\u5b9a\uff01
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u82cf\u5dde\u70ed\u5de5\u7814\u7a76\u9662\u6709\u9650\u516c\u53f8-\u5927\u5b97\u6750\u6599\u65b9\u6848\u5236\u5b9a\u548c\u5ba1\u67e5\u52a9\u624b
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u56fd\u6838\u81ea\u4eea\u7cfb\u7edf\u5de5\u7a0b\u6709\u9650\u516c\u53f8-NuCON AI\u5e2e
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u4e2d\u8239\u52a8\u529b\u4eba\u5de5\u667a\u80fd\"\u667a\u6167\u52a8\u529b\u4e91\u52a9\u624b\"\u53ca\u9996\u6279\u6570\u5b57\u5458\u5de5\u6b63\u5f0f\u4e0a\u7ebf
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u5357\u5b81\u77ff\u4e1a\u96c6\u56e2\u667a\u6167\u77ff\u5c71AI\u52a9\u624b
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1aDeepSeek\u843d\u5730\u5f18\u76db\u94dc\u4e1a\uff1a\u56fd\u4ea7\u5927\u6a21\u578b\u70b9\u4eae\"\u9ed1\u706f\u5de5\u5382\"\u65b0\u5f15\u64ce
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u62e5\u62b1\u667a\u80fd\u65f6\u4ee3\uff01\u4e2d\u56fd\u4e94\u77ff\u4ee5 \u201cAI+\u201d\u8d4b\u80fd\u4f01\u4e1a\u53d1\u5c55
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1aDeepSeek\u8d4b\u80fd\u4e2d\u51b6\u6b66\u52d8AI\u667a\u80fd\u4f53
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u91cd\u78c5\uff01\u9655\u897f\u5e7f\u7535\u7f51\u7edc\u201c\u79e6\u5cad\u4e91\u201d\u5e73\u53f0\u5b9e\u73b0DeepSeek\u672c\u5730\u5316\u90e8\u7f72
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u8c6b\u56ed\u80a1\u4efd-\u515a\u7fa4AI\u667a\u80fd\u4f53\u2014e\u5bb6\u540c\u667a\uff08\u5185\u6d4b\u7248\uff09\u6765\u5566
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u7ca4\u6d77\u96c6\u56e2\u5b8c\u6210DeepSeek\u79c1\u6709\u5316\u90e8\u7f72\uff0c\u52a9\u529b\u96c6\u56e2\u667a\u80fd\u5316\u7ba1\u7406
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u5efa\u7b51\u6750\u6599\u5de5\u4e1a\u4fe1\u606f\u4e2d\u5fc3\u5b8c\u6210DeepSeek\u672c\u5730\u5316\u90e8\u7f72\uff0c\u63a8\u52a8\u884c\u4e1a\u6570\u667a\u5316\u8f6c\u578b\u65b0\u53d1\u5c55
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u4e00\u8d77DeepSeek\uff01\u798f\u5efa\u8bbe\u8ba1\u4ee5AI\u5927\u6a21\u578b\u5f00\u542f\u65b0\u7bc7\u7ae0
  • MaxKB \u5e94\u7528\u6848\u4f8b\uff1a\u90d1\u5dde\u6d77\u5173\u4e0a\u7ebf AI \u5ba1\u5355\u667a\u80fd\u4f53
"},{"location":"#5","title":"5 \u4e86\u89e3\u66f4\u591a","text":"
  • \u5982\u4f55\u5411\u56e2\u961f\u4ecb\u7ecd MaxKB
  • \u98de\u81f4\u4e91\u57f9\u8bad\u8ba4\u8bc1\u4e2d\u5fc3
  • MaxKB \u5c0f\u8bfe\u5802
  • MaxKB \u77e5\u8bc6\u5e93
"},{"location":"changelog/","title":"\u66f4\u65b0\u65e5\u5fd7","text":""},{"location":"changelog/#1","title":"1 \u7248\u672c\u8bf4\u660e","text":"

\u7248\u672c\u53f7\u8bf4\u660e\uff1a \u50cf\u5176\u5b83\u4f18\u79c0\u5f00\u6e90\u9879\u76ee\u4e00\u6837\uff0cMaxKB \u5c06\u4fdd\u6301\u6bcf\u6708\u53d1\u5e03\u4e00\u4e2a\u65b0\u7684\u529f\u80fd\u7248\u672c\uff0c\u529f\u80fd\u7248\u672c\u4e2d\u5982\u9047\u8f83\u4e3a\u7d27\u6025\u6216\u4e25\u91cd\u7684 Bug\uff0c\u5c06\u53ca\u65f6\u63a8\u51fa Bug \u4fee\u590d\u7684\u5c0f\u7248\u672c\u3002 MaxKB \u7248\u672c\u53f7\u547d\u540d\u89c4\u5219\u4e3a\uff1a v \u5927\u7248\u672c.\u529f\u80fd\u7248\u672c. Bug \u4fee\u590d\u7248\u672c\uff0c\u793a\u4f8b\u5982\u4e0b\uff1a

  • v2.0.1 \u662f v2.0.0 \u4e4b\u540e\u7684 Bug \u4fee\u590d\u7248\u672c
  • v2.1.0 \u662f v2.0.0 \u4e4b\u540e\u7684\u529f\u80fd\u7248\u672c
"},{"location":"changelog/#2","title":"2 \u66f4\u65b0\u5185\u5bb9","text":""},{"location":"changelog/#v221","title":"v2.2.1","text":"

2025 \u5e74 10 \u6708 11 \u65e5

\u529f\u80fd\u4f18\u5316

  • \u5de5\u5177\uff1a\u8f93\u5165\u53c2\u6570\u65b0\u589e\u53c2\u6570\u63d0\u793a\u8bf4\u660e\u5b57\u6bb5\uff1b
  • \u5de5\u5177\uff1a\u4ece\u5de5\u5177\u5546\u5e97\u6dfb\u52a0\u7684\u5de5\u5177\uff0c\u70b9\u51fb\u9762\u677f\u53ef\u4ee5\u6253\u5f00\u5de5\u5177\u8be6\u60c5\uff1b
  • \u6a21\u578b\uff1a\u963f\u91cc\u4e91\u767e\u70bc\u4f9b\u5e94\u5546\u89c6\u89c9\u6a21\u578b\u652f\u6301 qwen-vl-ocr\u3002

\u95ee\u9898\u4fee\u590d

  • \u5e94\u7528\uff1a\u4fee\u590d\u6dfb\u52a0\u7ec4\u4ef6\u65f6\u62d6\u62fd MCP \u8c03\u7528\u8282\u70b9\u663e\u793a\u5f02\u5e38\u7684\u95ee\u9898\uff1b
  • \u5e94\u7528\uff1a\u4fee\u590d\u5224\u65ad\u5668\u4e0d\u540c\u5206\u652f\u65e0\u6cd5\u8fde\u63a5\u540c\u4e00\u4e2a\u540e\u7f6e\u8282\u70b9\u7684\u95ee\u9898\uff1b
  • \u5e94\u7528\uff1a\u4fee\u590d\u6dfb\u52a0\u591a\u4e2a\u5faa\u73af\u8282\u70b9\uff0c\u6709\u6982\u7387\u51fa\u73b0\u591a\u4f59\u7684\u5355\u72ec\u5faa\u73af\u4f53\uff1b
  • \u5e94\u7528\uff1a\u4fee\u590d\u201c\u9009\u62e9\u53d8\u91cf\u201d\u7684\u4e0b\u62c9\u9009\u9879\u4e2d\u524d\u7f6e\u8282\u70b9\u7684 icon \u663e\u793a\u4e0d\u6b63\u786e\u7684\u95ee\u9898\uff1b
  • \u5e94\u7528\uff1a\u4fee\u590d\u5224\u65ad\u5668\u4e2d\u5224\u65ad\u53d8\u91cf\u4e3a\u7a7a\u5224\u6761\u4ef6\u62a5\u9519\u7684\u95ee\u9898\uff1b
  • \u5e94\u7528\uff1a\u4fee\u590d\u77e5\u8bc6\u5e93\u68c0\u7d22\u8282\u70b9\u9009\u62e9\u77e5\u8bc6\u5e93\u540e\uff0c\u590d\u5236\u8be5\u8282\u70b9\u4f1a\u7f3a\u5c11\u53c2\u6570\uff1b
  • \u5de5\u5177\uff1a\u4fee\u590d\u5de5\u5177\u5546\u5e97\u4e2d\u7684\u5de5\u5177\u4e0d\u663e\u793a\u63cf\u8ff0\u7684\u95ee\u9898\uff1b
  • \u5de5\u5177\uff1a\u4fee\u590d\u521b\u5efa\u5de5\u5177\u65f6\u91cd\u590d\u70b9\u51fb\u521b\u5efa\u6309\u94ae\u4f1a\u521b\u5efa\u591a\u4e2a\u5de5\u5177\u7684\u95ee\u9898\uff1b
  • \u7cfb\u7edf\uff1a\u4fee\u590d\u9a8c\u8bc1\u7801\u9519\u8bef\u7684\u63d0\u793a\u4fe1\u606f\u56fd\u9645\u5316\u4e0d\u6b63\u786e\u7684\u95ee\u9898\uff1b
  • \u7cfb\u7edf\uff1a\u8bed\u8a00\u5207\u6362\u4e3a\u82f1\u6587\u540e\uff0c\u5185\u7f6e\u89d2\u8272\u4e0d\u751f\u6548\u7684\u95ee\u9898\u3002
"},{"location":"changelog/#v220","title":"v2.2.0","text":"

2025 \u5e74 9 \u6708 30 \u65e5

\u65b0\u589e\u529f\u80fd

  • \u5de5\u5177\uff1a\u65b0\u589e\u5de5\u5177\u5546\u5e97\uff1b
  • \u5de5\u4f5c\u6d41\uff1a\u65b0\u589e\u5faa\u73af\u8282\u70b9\uff1b
  • \u5de5\u4f5c\u6d41\uff1a\u65b0\u589e\u610f\u56fe\u8bc6\u522b\u8282\u70b9\uff1b
  • \u5de5\u4f5c\u6d41\uff1a\u65b0\u589e\u6587\u751f\u89c6\u9891\u3001\u56fe\u751f\u89c6\u9891\u8282\u70b9\uff1b
  • \u5e94\u7528\uff1a\u7b80\u6613\u5e94\u7528\u65b0\u589e\u652f\u6301 MCP \u548c\u5de5\u5177\u8c03\u7528\u529f\u80fd\uff1b
  • \u5e94\u7528\uff1a\u7b80\u6613\u5e94\u7528\u65b0\u589e\u652f\u6301\u751f\u6210\u63d0\u793a\u8bcd\uff1b
  • \u5e94\u7528\uff1a\u5e94\u7528\u65b0\u589e\u201c\u8f93\u51fa MCP/\u5de5\u5177\u6267\u884c\u8fc7\u7a0b\u201d\u5f00\u5173\u8bbe\u7f6e\uff1b
  • \u5e94\u7528\uff1a\u53d8\u91cf\u8d4b\u503c\u8282\u70b9\u8d4b\u503c\u65f6\u6570\u636e\u7c7b\u578b\u65b0\u589e\u652f\u6301 bool \u7c7b\u578b\uff1b
  • \u77e5\u8bc6\u5e93\uff1a\u652f\u6301\u4e3a\u5904\u7406\u751f\u6210\u95ee\u9898\u4efb\u52a1\u7684\u6a21\u578b\u8fdb\u884c\u53c2\u6570\u8bbe\u7f6e\uff1b
  • \u6a21\u578b\uff1a\u963f\u91cc\u4e91\u767e\u70bc\u4f9b\u5e94\u5546\u65b0\u589e\u652f\u6301\u6587\u751f\u89c6\u9891\u3001\u56fe\u751f\u89c6\u9891\u6a21\u578b\uff1b
  • \u6a21\u578b\uff1a\u706b\u5c71\u5f15\u64ce\u4f9b\u5e94\u5546\u65b0\u589e\u652f\u6301\u6587\u751f\u89c6\u9891\u3001\u56fe\u751f\u89c6\u9891\u6a21\u578b\uff1b
  • \u6a21\u578b\uff1a\u8bed\u97f3\u8bc6\u522b\u6a21\u578b\u652f\u6301\u6a21\u578b\u53c2\u6570\u8bbe\u7f6e\uff1b
  • \u767b\u5f55\uff1a\u5c06\u767b\u5f55\u9a8c\u8bc1\u7801\u5347\u7ea7\u4e3a\u5177\u5907\u7528\u6237\u9694\u79bb\u529f\u80fd\u7684\u8ba4\u8bc1\u673a\u5236\uff1b
  • \u767b\u5f55\u8ba4\u8bc1\uff1a\u65b0\u589e\u9ed8\u8ba4\u767b\u5f55\u65b9\u5f0f\u8bbe\u7f6e\uff08X-Pack\uff09\uff1b
  • \u5bf9\u8bdd\u7528\u6237\uff1a\u65b0\u589e\u7528\u6237\u767b\u5f55\u5931\u8d25\u6307\u5b9a\u6b21\u6570\u540e\u542f\u7528\u9a8c\u8bc1\u7801\u6821\u9a8c\u7684\u8bbe\u7f6e\uff08X-Pack\uff09\u3002

\u529f\u80fd\u4f18\u5316

  • \u5e94\u7528\uff1a\u4f18\u5316\u9ad8\u7ea7\u7f16\u6392\u5e94\u7528\u7684\u201c\u6dfb\u52a0\u7ec4\u4ef6\u201d\u663e\u793a\u6837\u5f0f\uff1b
  • \u5e94\u7528\uff1a\u4f18\u5316\u7cfb\u7edf\u63d0\u793a\u8bcd\u548c\u7528\u6237\u63d0\u793a\u8bcd\u63cf\u8ff0\uff1b
  • \u77e5\u8bc6\u5e93\uff1a\u95ee\u9898\u5217\u8868\u652f\u6301\u201c\u663e\u793a 1000 \u6761\u201d\u9009\u9879\u8bbe\u7f6e\uff1b
  • \u95ee\u7b54\u9875\u9762\uff1a\u589e\u52a0\u201c\u8fd4\u56de\u5e95\u90e8\u201d\u5feb\u6377\u64cd\u4f5c\uff1b
  • \u8d44\u6e90\u7ba1\u7406\uff1a\u8d44\u6e90\u5217\u8868\u7b5b\u9009\u9879\u65b0\u589e\u652f\u6301\u6309\u7c7b\u578b\u7b5b\u9009\uff08X-Pack\uff09\u3002

\u95ee\u9898\u4fee\u590d

  • \u6a21\u578b\uff1a\u4fee\u590d\u7845\u57fa\u6d41\u52a8\u4f9b\u5e94\u5546\u7684\u8bed\u97f3\u5408\u6210\u6a21\u578b\u53c2\u6570\u8bbe\u7f6e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b
  • \u5e94\u7528\uff1a\u4fee\u590d\u4f7f\u7528\u5e94\u7528 API \u63a5\u53e3\u8fdb\u884c\u5bf9\u8bdd\u65f6\u672a\u8fd4\u56de\u601d\u8003\u8fc7\u7a0b\u7684\u95ee\u9898\uff1b
  • \u5e94\u7528\uff1a\u4fee\u590d\u8bbf\u95ee\u9650\u5236\u4e2d\u767b\u5f55\u65b9\u5f0f\u663e\u793a\u987a\u5e8f\u672a\u6309\u5206\u7c7b\u6392\u5e8f\u7684\u95ee\u9898\uff1b
  • \u5e94\u7528\uff1a\u4fee\u590d\u8bbf\u95ee\u9650\u5236\u4e2d\u201c\u6bcf\u4e2a\u5ba2\u6237\u7aef\u63d0\u95ee\u6b21\u6570\u9650\u5236\u201d\u9009\u9879\u8bbe\u7f6e\u672a\u751f\u6548\u7684\u95ee\u9898\uff1b
  • \u77e5\u8bc6\u5e93\uff1a\u4fee\u590d\u77e5\u8bc6\u5e93\u6570\u636e\u91cf\u8f83\u5927\u60c5\u51b5\u4e0b\uff0c\u5bfc\u51fa\u77e5\u8bc6\u5e93\u8d85\u65f6\u62a5\u9519\u7684\u95ee\u9898\uff1b
  • \u95ee\u7b54\u9875\u9762\uff1a\u4fee\u590d iOS \u7cfb\u7edf\u90e8\u5206\u6d4f\u89c8\u5668\u4e0d\u663e\u793a\u53d1\u9001\u6309\u94ae\u7684\u95ee\u9898\uff1b
  • \u95ee\u7b54\u9875\u9762\uff1a\u4fee\u590d\u5e94\u7528\u8bbe\u7f6e question \u63a5\u53e3\u53c2\u6570\u540e\uff0c\u5728\u95ee\u7b54\u9875\u9762\u5237\u65b0\u6d4f\u89c8\u5668\u4f1a\u6253\u5f00\u5e94\u7528\u5217\u8868\u9875\u9762\u7684\u95ee\u9898\uff1b
  • \u95ee\u7b54\u9875\u9762\uff1a\u4fee\u590d\u601d\u8003\u8fc7\u7a0b\u5b57\u4f53\u6837\u5f0f\u4e0d\u6b63\u786e\u7684\u95ee\u9898\u3002
"},{"location":"changelog/#v212","title":"v2.1.2","text":"

2025 \u5e74 9 \u6708 23 \u65e5

\u95ee\u9898\u4fee\u590d

  • \u5e94\u7528\uff1a\u4fee\u590d\u65b0\u5efa\u7684\u201cMCP \u8c03\u7528\u201d\u8282\u70b9\uff0c\u6267\u884c\u4f1a\u62a5\u9519\u7684\u95ee\u9898\uff1b
  • \u77e5\u8bc6\u5e93\uff1a\u4fee\u590d\u77e5\u8bc6\u5e93\u8bbe\u7f6e\u4e2d\u201c\u6bcf\u6b21\u4e0a\u4f20\u6700\u591a\u6587\u4ef6\u6570\u201d\u8bbe\u7f6e\u4e0d\u751f\u6548\u7684\u95ee\u9898\u3002
"},{"location":"changelog/#v211","title":"v2.1.1","text":"

2025 \u5e74 9 \u6708 11 \u65e5

\u529f\u80fd\u4f18\u5316

  • \u5e94\u7528\uff1aAI \u5bf9\u8bdd\u8282\u70b9\u7684 MCP \u8bbe\u7f6e\u529f\u80fd\u652f\u6301\u9009\u62e9\u591a\u4e2a MCP \u5de5\u5177\u3002

\u95ee\u9898\u4fee\u590d

  • \u5de5\u5177\uff1a\u4fee\u590d\u5de5\u5177\u6267\u884c\u4efb\u610f\u7cfb\u7edf\u547d\u4ee4\u7684\u6f0f\u6d1e\uff1b
  • \u5de5\u5177\uff1a\u4fee\u590d MCP \u7f16\u8f91\u9875\u9762\u6837\u5f0f\u663e\u793a\u5f02\u5e38\u7684\u95ee\u9898\uff1b
  • \u5e94\u7528\uff1a\u4fee\u590d\u5728\u57fa\u7840\u4fe1\u606f\u8282\u70b9\u4e2d\u65e0\u6cd5\u6dfb\u52a0\u591a\u4e2a\u4f1a\u8bdd\u53d8\u91cf\u7684\u95ee\u9898\uff1b
  • \u5e94\u7528\uff1a\u4fee\u590d\u5168\u5c40\u53d8\u91cf\u201c\u5f53\u524d\u65f6\u95f4\u201d\u7684\u65f6\u533a\u4e0d\u6b63\u786e\u7684\u95ee\u9898\uff1b
  • \u5e94\u7528\uff1a\u4fee\u590d\u5728\u7528\u6237\u8f93\u5165\u6807\u9898\u8bbe\u7f6e\u5bf9\u8bdd\u6846\u4e2d\uff0c\u6309\u56de\u8f66\u952e\u4f1a\u65b0\u5f00\u7f51\u9875\u7684\u95ee\u9898\uff1b
  • \u77e5\u8bc6\u5e93\uff1a\u4fee\u590d\u5bfc\u51fa\u77e5\u8bc6\u5e93\u6ca1\u6709\u5bfc\u51fa\u77e5\u8bc6\u5e93\u4e2d\u7684\u56fe\u7247\u5185\u5bb9\uff1b
  • \u77e5\u8bc6\u5e93\uff1a\u4fee\u590d\u5bfc\u51fa\u77e5\u8bc6\u5e93\u7684\u6587\u4ef6\u540d\u79f0\u4e0d\u662f\u77e5\u8bc6\u5e93\u540d\u79f0\u7684\u95ee\u9898\uff1b
  • \u89d2\u8272\u7ba1\u7406\uff08X-Pack\uff09\uff1a\u4fee\u590d\u89d2\u8272\u7ba1\u7406\u529f\u80fd\u56fd\u9645\u5316\u663e\u793a\u4e0d\u6b63\u786e\u7684\u95ee\u9898\u3002
"},{"location":"changelog/#v210","title":"v2.1.0","text":"

2025 \u5e74 9 \u6708 4 \u65e5

\u65b0\u589e\u529f\u80fd

  • \u5de5\u5177\uff1a\u65b0\u589e MCP \u5de5\u5177\u7ba1\u7406\u529f\u80fd\uff1b
  • \u5e94\u7528\uff1aAI \u5bf9\u8bdd\u8282\u70b9\u65b0\u589e\u5de5\u5177\u8bbe\u7f6e\uff0c\u7528\u6237\u9009\u5b9a\u81ea\u5b9a\u4e49\u5de5\u5177\u540e\uff0c\u6a21\u578b\u53ef\u81ea\u4e3b\u51b3\u7b56\u662f\u5426\u8c03\u7528\u5df2\u914d\u7f6e\u7684\u5de5\u5177\uff1b
  • \u5e94\u7528\uff1a\u8868\u5355\u6536\u96c6\u8282\u70b9\u7684\u53c2\u6570\u652f\u6301\u5f15\u7528\u53d8\u91cf\uff1b
  • \u5e94\u7528\uff1a\u8868\u5355\u6536\u96c6\u8282\u70b9\u65b0\u589e\u4e86\u591a\u884c\u6587\u672c\u6846\u3001\u6587\u4ef6\u4e0a\u4f20\u548c\u5355\u884c\u591a\u9009\u6846\u7ec4\u4ef6\uff1b
  • \u5e94\u7528\uff08X-Pack\uff09\uff1a\u5e94\u7528\u63a5\u5165\u652f\u6301\u5bf9\u63a5\u4f01\u4e1a\u5fae\u4fe1\u667a\u80fd\u673a\u5668\u4eba\uff0c\u652f\u6301\u7528\u6237\u5b9e\u73b0 AI \u80fd\u529b\u4e0e\u4f01\u4e1a\u5fae\u4fe1\u529e\u516c\u751f\u6001\u7684\u9ad8\u6548\u8054\u52a8\uff1b
  • \u5e94\u7528\uff08X-Pack\uff09\uff1a\u663e\u793a\u8bbe\u7f6e\u4e2d\u65b0\u589e\u201c\u663e\u793a\u5386\u53f2\u8bb0\u5f55\u201d\u7684\u8bbe\u7f6e\u9009\u9879\uff1b
  • \u95ee\u7b54\u9875\u9762\uff1a\u5728\u95ee\u7b54\u9875\u9762\u4e2d\u652f\u6301\u5c06\u5f53\u524d\u7684\u5bf9\u8bdd\u8bb0\u5f55\u5bfc\u51fa\u4e3a PDF \u548c PNG \u56fe\u7247\u683c\u5f0f\uff1b
  • \u77e5\u8bc6\u5e93\uff1a\u9488\u5bf9\u901a\u7528\u77e5\u8bc6\u5e93\u548c\u98de\u4e66\u77e5\u8bc6\u5e93\u7684\u6587\u6863\u65b0\u589e\u201c\u662f\u5426\u5141\u8bb8\u5728\u77e5\u8bc6\u6765\u6e90\u4e2d\u4e0b\u8f7d\u201d\u7684\u8bbe\u7f6e\u9009\u9879\uff1b
  • \u8d44\u6e90\u6388\u6743\uff1a\u65b0\u589e\u6309\u8d44\u6e90\u7ef4\u5ea6\u6388\u6743\u529f\u80fd\uff0c\u652f\u6301\u5c06\u5e94\u7528\u3001\u77e5\u8bc6\u5e93\u3001\u5de5\u5177\u3001\u6a21\u578b\u6838\u5fc3\u8d44\u6e90\u6388\u6743\u7ed9\u6307\u5b9a\u7528\u6237\uff1b
  • \u8d44\u6e90\u6388\u6743\uff1a\u7cfb\u7edf\u7ba1\u7406\u4e2d\u6309\u7528\u6237\u8fdb\u884c\u8d44\u6e90\u6388\u6743\u65f6\uff0c\u652f\u6301\u4e3a\u6bcf\u4e2a\u8d44\u6e90\u8bbe\u7f6e\u4e0d\u540c\u7684\u6743\u9650\uff1b
  • \u6a21\u578b\uff1avLLM \u4f9b\u5e94\u5546\u65b0\u589e\u652f\u6301\u91cd\u6392\u6a21\u578b\u548c\u8bed\u97f3\u8bc6\u522b\u6a21\u578b\uff1b
  • \u6a21\u578b\uff1a\u817e\u8baf\u6df7\u5143\u4f9b\u5e94\u5546\u65b0\u589e\u652f\u6301\u8bed\u97f3\u8bc6\u522b\u6a21\u578b\uff1b
  • \u6a21\u578b\uff1a\u8baf\u98de\u661f\u706b\u4f9b\u5e94\u5546\u7684\u8bed\u97f3\u8bc6\u522b\u6a21\u578b\u65b0\u589e\u652f\u6301\u4e2d\u6587\u8bed\u97f3\u5927\u6a21\u578b\uff1b
  • \u6a21\u578b\uff1a\u963f\u91cc\u4e91\u767e\u70bc\u4f9b\u5e94\u5546\u7684\u8bed\u97f3\u8bc6\u522b\u6a21\u578b\u65b0\u589e\u652f\u6301 qwen-omni-turbo\u3001qwen2.5-omni-7b \u548c ASR \u6a21\u578b\uff1b
  • \u6a21\u578b\uff1a\u767e\u5ea6\u5343\u5e06\u5927\u6a21\u578b\u4f9b\u5e94\u5546\u65b0\u589e\u652f\u6301 API \u7248\u672c\u4e3a V2 \u7684\u5bf9\u63a5\u65b9\u5f0f\u3002

\u529f\u80fd\u4f18\u5316

  • \u5e94\u7528\uff1a\u5bf9\u8bdd\u65e5\u5fd7\u5217\u8868\u65b0\u589e\u6309\u7528\u6237\u67e5\u8be2\u7684\u529f\u80fd\uff1b
  • \u5e94\u7528\uff08X-Pack\uff09\uff1a\u5e94\u7528\u63a5\u5165\u98de\u4e66\u540e\uff0cAI \u56de\u590d\u5185\u5bb9\u4ee5 Markdown \u683c\u5f0f\u5448\u73b0\uff1b
  • \u95ee\u7b54\u9875\u9762\uff1a\u8fdb\u5165\u95ee\u7b54\u9875\u9762\u65f6\u9ed8\u8ba4\u81ea\u52a8\u65b0\u5efa\u5bf9\u8bdd\uff1b
  • \u95ee\u7b54\u9875\u9762\uff1a\u4f18\u5316\u4e0a\u4f20\u6587\u4ef6\u6216\u56fe\u7247\u65f6\uff0c\u4e0d\u81ea\u52a8\u751f\u6210\u9ed8\u8ba4\u95ee\u9898\u7684\u95ee\u9898\uff1b
  • \u5de5\u5177\uff1a\u521b\u5efa\u6216\u7f16\u8f91\u5de5\u5177\u70b9\u51fb\u201c\u5173\u95ed\u201d\u6216\u201c\u53d6\u6d88\u201d\u6309\u94ae\u65f6\uff0c\u589e\u52a0\u4e8c\u6b21\u786e\u8ba4\u63d0\u793a\uff1b
  • \u767b\u5f55\uff1a\u7528\u6237\u4f7f\u7528\u9ed8\u8ba4\u5bc6\u7801\u767b\u5f55\u540e\uff0c\u9700\u8981\u5148\u4fee\u6539\u5bc6\u7801\u65b9\u53ef\u7ee7\u7eed\u4f7f\u7528\u3002

\u95ee\u9898\u4fee\u590d

  • \u5e94\u7528\uff1a\u4fee\u590d\u9ad8\u7ea7\u7f16\u6392\u5e94\u7528\u4e2d MCP \u8282\u70b9\u672a\u56fd\u9645\u5316\u7684\u95ee\u9898\uff1b
  • \u5e94\u7528\uff1a\u4fee\u590d\u8868\u5355\u6536\u96c6\u8282\u70b9\u540e\u4f7f\u7528\u4f1a\u8bdd\u53d8\u91cf\u65f6\uff0c\u65e0\u6cd5\u8bfb\u53d6\u53d8\u91cf\u7684\u503c\u7684\u95ee\u9898\uff1b
  • \u95ee\u7b54\u9875\u9762\uff08X-Pack)\uff1a\u4fee\u590d\u6d4f\u89c8\u5668\u9875\u7b7e\u4e2d\u672a\u663e\u793a\u81ea\u5b9a\u4e49\u5e94\u7528 Logo \u7684\u95ee\u9898\uff1b
  • \u95ee\u7b54\u9875\u9762\uff08X-Pack\uff09\uff1a\u4fee\u590d\u5728\u201c\u8bbf\u95ee\u9650\u5236\u201d\u529f\u80fd\u4e2d\u5207\u6362\u5e94\u7528\u7684\u8eab\u4efd\u8ba4\u8bc1\u65b9\u5f0f\u65f6\uff0c\u5df2\u6709\u7684\u8ba4\u8bc1\u4fe1\u606f\u4ecd\u7136\u751f\u6548\u7684\u95ee\u9898\uff1b
  • \u95ee\u7b54\u9875\u9762\uff1a\u4fee\u590d\u70b9\u51fb\u5de6\u4fa7\u5bfc\u822a\u533a\u57df\u7684\u201c\u6536\u8d77\u201d\u6309\u94ae\u65f6\uff0c\u5185\u5bb9\u5c55\u793a\u6837\u5f0f\u9519\u4e71\u7684\u95ee\u9898\uff1b
  • \u95ee\u7b54\u9875\u9762\uff1a\u4fee\u590d\u5bf9\u8bdd\u7528\u6237\u91cd\u65b0\u767b\u5f55\u540e\u63d0\u95ee\u65f6\uff0c\u63d0\u793a\u7f3a\u5931\u53c2\u6570\u7684\u95ee\u9898\uff1b
  • \u95ee\u7b54\u9875\u9762\uff1a\u4fee\u590d\u5386\u53f2\u8bb0\u5f55\u6570\u636e\u65f6\uff0c\u5bf9\u8bdd\u8bb0\u5f55\u533a\u57df\u4e0d\u663e\u793a\u8bb0\u5f55\u7684\u95ee\u9898\uff1b
  • \u95ee\u7b54\u9875\u9762\uff1a\u4fee\u590d\u4e0a\u4f20\u7a7a\u6587\u4ef6\u4f1a\u5bfc\u81f4\u63d0\u53d6\u5f02\u5e38\u7684\u95ee\u9898\uff1b
  • \u95ee\u7b54\u9875\u9762\uff1a\u4fee\u590d\u5feb\u6377\u95ee\u9898\u7684\u5185\u5bb9\u8f83\u957f\u65f6\uff0c\u6807\u7b7e\u663e\u793a\u5f02\u5e38\u7684\u95ee\u9898\uff1b
  • \u77e5\u8bc6\u5e93\uff1a\u4fee\u590d\u7cfb\u7edf\u65e0 License \u6388\u6743\u65f6\uff0c\u547d\u4e2d\u6d4b\u8bd5\u754c\u9762\u8f93\u5165\u6846\u663e\u793a\u4e0d\u5b8c\u6574\u7684\u95ee\u9898\uff1b
  • \u77e5\u8bc6\u5e93\uff1a\u4fee\u590d\u77e5\u8bc6\u5e93\u4e0a\u4f20\u6587\u6863\u65f6\uff0c\u70b9\u51fb\u201c\u8fd4\u56de\u201d\u6309\u94ae\u6ca1\u6709\u4e8c\u6b21\u786e\u8ba4\u7684\u95ee\u9898\uff1b
  • \u77e5\u8bc6\u5e93\uff1a\u4fee\u590d\u77e5\u8bc6\u5e93\u5206\u6bb5\u8be6\u60c5\u4e2d\u6309\u5206\u6bb5\u5185\u5bb9\u641c\u7d22\uff0c\u67e5\u8be2\u7ed3\u679c\u4e0d\u6b63\u786e\u7684\u95ee\u9898\uff1b
  • \u77e5\u8bc6\u5e93\uff1a\u4fee\u590d\u540c\u4e00\u4e2a\u5206\u6bb5\u53ef\u4ee5\u91cd\u590d\u591a\u6b21\u5173\u8054\u540c\u4e00\u4e2a\u95ee\u9898\u7684\u95ee\u9898\uff1b
  • \u77e5\u8bc6\u5e93\uff1a\u4fee\u590d\u95ee\u9898\u5217\u8868\u4e2d\u201c\u5173\u8054\u5206\u6bb5\u6570\u201d\u7edf\u8ba1\u4e0d\u6b63\u786e\u7684\u95ee\u9898\uff1b
  • \u6a21\u578b\uff1a\u4fee\u590d\u201c\u5168\u90e8\u6a21\u578b\u201d\u5217\u8868\u4e2d\u6a21\u578b\u672a\u6309\u521b\u5efa\u65f6\u95f4\u964d\u5e8f\u663e\u793a\u7684\u95ee\u9898\uff1b
  • \u8d44\u6e90\u6388\u6743\uff1a\u4fee\u590d\u4ec5\u5177\u6709\u77e5\u8bc6\u5e93\u67e5\u770b\u6743\u9650\u7684\u7528\u6237\u53ef\u5728\u5bf9\u8bdd\u65e5\u5fd7\u4e2d\u6dfb\u52a0\u5206\u6bb5\u7684\u95ee\u9898\uff1b
  • \u6587\u4ef6\u5939\uff1a\u4fee\u590d\u5728\u5e94\u7528\u548c\u77e5\u8bc6\u5e93\u7684\u8d44\u6e90\u8be6\u60c5\u4e2d\u70b9\u51fb\u201c\u8fd4\u56de\u201d\u6309\u94ae\u65f6\uff0c\u6bcf\u6b21\u90fd\u8fd4\u56de\u5230\u6839\u76ee\u5f55\u7684\u95ee\u9898\uff1b
  • \u5bf9\u8bdd\u7528\u6237\uff08X-Pack\uff09\uff1a\u4fee\u590d\u540c\u6b65\u7cfb\u7edf\u7528\u6237\u65f6\u672a\u540c\u6b65\u7528\u6237\u5bc6\u7801\u7684\u95ee\u9898\uff1b
  • \u5bf9\u8bdd\u7528\u6237\uff08X-Pack\uff09\uff1a\u4fee\u590d\u65b0\u5efa\u5bf9\u8bdd\u7528\u6237\u65f6\uff0c\u672a\u8bbe\u7f6e\u7528\u6237\u7ec4\u4e5f\u80fd\u521b\u5efa\u6210\u529f\u7684\u95ee\u9898\u3002
"},{"location":"changelog/#v202","title":"v2.0.2","text":"

2025 \u5e74 8 \u6708 7 \u65e5

\u65b0\u589e\u529f\u80fd

  • \u5e94\u7528\uff1a\u9ad8\u7ea7\u7f16\u6392\u5e94\u7528\u65b0\u589e\u4f1a\u8bdd\u53d8\u91cf\u529f\u80fd\uff1b
  • \u5bf9\u8bdd\u7528\u6237\uff08X-Pack\uff09\uff1a\u652f\u6301\u5bf9\u8bdd\u7528\u6237\u626b\u7801\u767b\u5f55\uff1b
  • \u5bf9\u8bdd\u7528\u6237\uff08X-Pack\uff09\uff1a\u652f\u6301\u540c\u6b65 LDAP \u548c\u4f01\u4e1a\u5fae\u4fe1\u7528\u6237\uff1b
  • \u8d44\u6e90\u7ba1\u7406\uff08X-Pack\uff09\uff1a\u652f\u6301\u5de5\u4f5c\u7a7a\u95f4\u76f8\u5173\u8d44\u6e90\u7684\u7edf\u4e00\u7ba1\u7406\u3002

\u529f\u80fd\u4f18\u5316

  • \u5bf9\u8bdd\u7528\u6237\uff08X-Pack\uff09\uff1a\u652f\u6301\u6309\u7528\u6237\u6765\u6e90\u548c\u72b6\u6001\u67e5\u8be2\uff1b
  • \u77e5\u8bc6\u5e93\uff1a\u9488\u5bf9\u6570\u636e\u91cf\u8f83\u5927\u7684\u590d\u6742\u573a\u666f\uff0c\u63d0\u5347\u4e86\u77e5\u8bc6\u5e93\u68c0\u7d22\u6027\u80fd\uff1b
  • \u77e5\u8bc6\u5e93\uff1a\u5bf9\u8bdd\u7528\u6237\u652f\u6301\u6309\u7528\u6237\u6765\u6e90\u67e5\u8be2\uff1b
  • \u5e94\u7528\uff1a\u8c03\u6574\u9ad8\u7ea7\u7f16\u6392\u5e94\u7528\u7684\u6587\u4ef6\u4e0a\u4f20\u9650\u5236\uff0c\u5355\u6b21\u5bf9\u8bdd\u6700\u591a\u53ef\u4e0a\u4f20 100 \u4e2a\u6587\u4ef6\uff0c\u5355\u6587\u4ef6\u6700\u5927\u652f\u6301 1000 MB\uff1b
  • \u5e94\u7528\uff1a\u652f\u6301\u6309\u5e94\u7528\u53d1\u5e03\u72b6\u6001\u67e5\u8be2\uff1b
  • \u5e94\u7528\uff1a\u5bf9\u8bdd\u7528\u6237\u652f\u6301\u6309\u7528\u6237\u6765\u6e90\u67e5\u8be2\uff1b
  • \u95ee\u7b54\u9875\u9762\uff1a\u4e0a\u4f20\u6587\u4ef6\u540e\u81ea\u52a8\u586b\u5145\u95ee\u9898\u5b57\u6bb5\uff1b
  • \u95ee\u7b54\u9875\u9762\uff1a\u4f18\u5316\u6d6e\u7a97\u6a21\u5f0f\u548c\u79fb\u52a8\u6a21\u5f0f\u7684\u767b\u5f55\u4ea4\u4e92\u4f53\u9a8c\uff1b
  • \u7528\u6237\u7ba1\u7406\uff1a\u652f\u6301\u6309\u7528\u6237\u6765\u6e90\u548c\u72b6\u6001\u67e5\u8be2\uff1b
  • \u7cfb\u7edf\uff1a\u4f18\u5316\u7cfb\u7edfUI\u6837\u5f0f\u3002

\u95ee\u9898\u4fee\u590d

  • \u77e5\u8bc6\u5e93\uff1a\u4fee\u590d\u5728\u5168\u6587\u68c0\u7d22\u6a21\u5f0f\u4e0b\u547d\u4e2d\u6d4b\u8bd5\u62a5\u9519\u7684\u95ee\u9898\uff1b
  • \u77e5\u8bc6\u5e93\uff1a\u4fee\u590d\u4e0a\u4f20\u79bb\u7ebf\u6587\u6863\u9875\u9762\u90e8\u5206\u5185\u5bb9\u56fd\u9645\u5316\u663e\u793a\u4e0d\u6b63\u786e\u7684\u95ee\u9898\uff1b
  • \u77e5\u8bc6\u5e93\uff1a\u4fee\u590d\u4e0a\u4f20\u79bb\u7ebf\u6587\u6863\u7684\u5206\u6bb5\u89c4\u5219\u9875\u9762\u6eda\u52a8\u6761\u6eda\u52a8\u8303\u56f4\u4e0d\u6b63\u786e\u7684\u95ee\u9898\uff1b
  • \u5e94\u7528\uff08X-Pack\uff09\uff1a\u4fee\u590d\u5728\u5e94\u7528\u63a5\u5165\u7684\u9489\u9489\u5e73\u53f0\u5bf9\u8bdd\u65f6\uff0cAI \u56de\u590d\u672a\u6309 Markdown \u6837\u5f0f\u663e\u793a\u7684\u95ee\u9898\uff1b
  • \u5e94\u7528\uff1a\u4fee\u590d\u90e8\u5206\u60c5\u51b5\u4e0b MCP \u8c03\u7528\u8282\u70b9\u6267\u884c\u62a5\u9519\u7684\u95ee\u9898\uff1b
  • \u5e94\u7528\uff1a\u4fee\u590d\u76f8\u540c\u7684\u4e24\u8282\u70b9\u4e4b\u95f4\u591a\u6b21\u8fde\u7ebf\u5bfc\u81f4\u91cd\u590d\u6267\u884c\u7684\u95ee\u9898\uff1b
  • \u5e94\u7528\uff1a\u4fee\u590d\u4fee\u6539\u6a21\u578b\u53c2\u6570\u65f6\u53c2\u6570\u663e\u793a\u4e0d\u6b63\u786e\u7684\u95ee\u9898\uff1b
  • \u5e94\u7528\uff1a\u4fee\u590d\u6dfb\u52a0\u5e94\u7528\u5b50\u8282\u70b9\u65f6\u672a\u8fc7\u6ee4\u672a\u53d1\u5e03\u72b6\u6001\u5e94\u7528\u7684\u95ee\u9898\uff1b
  • \u95ee\u7b54\u9875\u9762\uff1a\u4fee\u590d\u4e0a\u4f20\u7684\u6587\u4ef6\u540d\u79f0\u4e2d\u542b\u6709\u201c&nbsp\u201d \u5b57\u7b26\u65f6\uff0cURL \u4e0d\u663e\u793a\u7684\u95ee\u9898\uff1b
  • \u95ee\u7b54\u9875\u9762\uff1a\u4fee\u590d\u7528\u6237\u5bf9\u8bdd\u65f6 AI \u56de\u590d\u7684\u56fe\u7247\u65e0\u6cd5\u70b9\u51fb\u653e\u5927\u7684\u95ee\u9898\uff1b
  • \u95ee\u7b54\u9875\u9762\uff1a\u4fee\u590dAI\u56de\u590d\u4e3a\u8868\u683c\u6570\u636e\u65f6\u663e\u793a\u9519\u4f4d\u7684\u95ee\u9898\uff1b
  • \u95ee\u7b54\u9875\u9762\uff08X-Pack\uff09\uff1a\u4fee\u590d License \u672a\u6388\u6743\u65f6\uff0c\u6253\u5f00\u95ee\u7b54\u9875\u9762\u62a5\u9519\u7684\u95ee\u9898\uff1b
  • \u5171\u4eab\u6a21\u578b\uff08X-Pack\uff09\uff1a\u4fee\u590d\u5220\u9664\u5171\u4eab\u6a21\u578b\u65f6\u62a5\u9519\u7684\u95ee\u9898\u3002
"},{"location":"changelog/#v201","title":"v2.0.1","text":"

2025 \u5e74 7 \u6708 18 \u65e5

\u95ee\u9898\u4fee\u590d

  • \u5e94\u7528\uff1a\u4fee\u590d\u5728\u201c\u663e\u793a\u8bbe\u7f6e\u201d \u529f\u80fd\u4e2d\u53ea\u5f00\u542f\u663e\u793a\u77e5\u8bc6\u6765\u6e90\u4e0d\u5f00\u542f\u6267\u884c\u8be6\u60c5\uff0c\u5bf9\u8bdd\u65f6\u77e5\u8bc6\u6765\u6e90\u7684\u5f15\u7528\u5206\u6bb5\u663e\u793a\u9519\u8bef\uff1b
  • \u5e94\u7528\uff1a\u4fee\u590d\u201c\u591a\u8def\u53ec\u56de\u201d\u8282\u70b9\u7684\u91cd\u6392\u5185\u5bb9\u7684\u503c\u4e3a\u7a7a\u65f6\uff0c\u5bf9\u8bdd\u65f6\u6267\u884c\u5230\u8be5\u8282\u70b9\u4f1a\u62a5\u9519\u7684\u95ee\u9898\uff1b
  • \u5de5\u5177\uff1a\u4fee\u590d\u666e\u901a\u7528\u6237\u89d2\u8272\u7684\u7528\u6237\u767b\u5f55\u7cfb\u7edf\u540e\uff0c\u521b\u5efa\u5de5\u5177\u754c\u9762\u7f3a\u5c11\u201c\u8c03\u8bd5\u201d\u529f\u80fd\uff1b
  • \u95ee\u7b54\u9875\u9762\uff1a\u4fee\u590dAI\u56de\u590d\u7684\u97f3\u9891\u6587\u4ef6\u65e0\u6cd5\u62d6\u62fd\u64ad\u653e\u7684\u95ee\u9898\uff1b
  • \u7528\u6237\u7ba1\u7406\uff1a\u4fee\u590d\u7684\u7f16\u8f91\u7528\u6237\u62a5\u9519\u7684\u95ee\u9898\uff1b
  • \u5171\u4eab\u5de5\u5177\uff1a\u4fee\u590d\u4ece\u5de5\u5177\u5546\u5e97\u6dfb\u52a0\u5de5\u5177\u5931\u8d25\u7684\u95ee\u9898\u3002\uff08X-Pack\uff09
"},{"location":"changelog/#v200","title":"v2.0.0","text":"

2025 \u5e74 7 \u6708 17 \u65e5

\u6a21\u5757 \u529f\u80fd\u9879 \u529f\u80fd\u63cf\u8ff0 \u5e94\u7528 \u5e94\u7528\u7ba1\u7406 \u652f\u6301\u521b\u5efa\u7b80\u5355\u5e94\u7528\u3001\u9ad8\u7ea7\u7f16\u6392\u5e94\u7528 \u652f\u6301\u4ee5\u591a\u7ea7\u76ee\u5f55\u7684\u65b9\u5f0f\u5206\u7c7b\u7ba1\u7406\u5e94\u7528 \u652f\u6301\u63a7\u5236\u5e94\u7528\u8bbf\u95ee\u884c\u4e3a\uff0c\u4f8b\u5982\u5141\u8bb8\u516c\u5f00\u8bbf\u95ee\u3001\u7981\u6b62\u516c\u5f00\u8bbf\u95ee \u652f\u6301\u5e94\u7528\u7684\u5bfc\u5165\u4e0e\u5bfc\u51fa \u9ad8\u7ea7\u7f16\u6392 \u652f\u6301\u521b\u5efa\u7b80\u5355\u5e94\u7528\u3001\u9ad8\u7ea7\u7f16\u6392\u5e94\u7528 \u5de5\u4f5c\u6d41\u7f16\u6392\u5e94\u7528\u652f\u6301 AI \u5bf9\u8bdd\u3001\u77e5\u8bc6\u5e93\u68c0\u7d22\u3001\u95ee\u9898\u4f18\u5316\u3001\u5224\u65ad\u3001\u6307\u5b9a\u56de\u590d\u3001\u6587\u6863\u5185\u5bb9\u603b\u7ed3\u3001\u6587\u672c\u8f6c\u8bed\u97f3\u3001\u8bed\u97f3\u8f6c\u6587\u672c\u3001\u56fe\u7247\u7406\u89e3\u3001\u56fe\u7247\u751f\u6210\u3001\u8868\u5355\u6536\u96c6\u3001MCP \u7b49\u8282\u70b9 \u652f\u6301\u63d0\u95ee\u65f6\u4e0a\u4f20\u6587\u672c\u3001\u56fe\u7247\u3001\u8bed\u97f3\u7b49\u7c7b\u578b\u6587\u4ef6 \u652f\u6301\u5728\u5de5\u4f5c\u6d41\u4e2d\u5f15\u7528\u5de5\u5177 \u652f\u6301\u5728\u5de5\u4f5c\u6d41\u4e2d\u5d4c\u5957\u5176\u5b83\u5e94\u7528 \u652f\u6301\u591a\u51fa\u591a\u8fdb\u548c\u5e76\u884c\u6267\u884c \u652f\u6301\u5168\u5c40\u53d8\u91cf \u652f\u6301\u81ea\u52a8\u4fdd\u5b58\u4ee5\u53ca\u6062\u590d\u5386\u53f2\u7248\u672c \u652f\u6301\u8bed\u97f3\u8f93\u5165\u81ea\u52a8\u53d1\u9001\u548c\u81ea\u52a8\u64ad\u653e \u652f\u6301\u81ea\u5b9a\u4e49\u601d\u8003\u8fc7\u7a0b\u7684\u6807\u7b7e\uff0c\u914d\u7f6e\u662f\u5426\u8f93\u51fa\u601d\u8003\u8fc7\u7a0b \u95ee\u7b54\u5d4c\u5165 \u652f\u6301\u95ee\u7b54\u5d4c\u5165\u7b2c\u4e09\u65b9\u5e94\u7528 \u8bbf\u95ee\u9650\u5236 \u652f\u6301\u6309\u5ba2\u6237\u7aef\u9650\u5236\u6bcf\u5929\u63d0\u95ee\u6b21\u6570\u9650\u5236 \u652f\u6301\u5d4c\u5165\u7b2c\u4e09\u65b9\u8bbf\u95ee\u767d\u540d\u5355\u8bbe\u7f6e \u663e\u793a\u8bbe\u7f6e \u652f\u6301\u63d0\u95ee\u65f6\u663e\u793a\u77e5\u8bc6\u6765\u6e90 \u652f\u6301\u8bbe\u7f6e\u4e2d\u95ee\u7b54\u9875\u9762\u7684\u8bed\u8a00\u8bbe\u7f6e \u7edf\u8ba1\u770b\u677f \u652f\u6301\u6309\u65f6\u95f4\u7edf\u8ba1\u7528\u6237\u6570\u3001\u63d0\u95ee\u6b21\u6570\u3001Tokens \u603b\u6570\u3001\u7528\u6237\u6ee1\u610f\u5ea6 \u652f\u6301\u7528\u6237\u6570\u3001\u63d0\u95ee\u6b21\u6570\u3001Tokens \u603b\u6570\u548c\u7528\u6237\u6ee1\u610f\u5ea6\u6307\u6807\u7684\u8d8b\u52bf\u7edf\u8ba1 \u77e5\u8bc6\u5e93 \u77e5\u8bc6\u5e93\u7ba1\u7406 \u652f\u6301\u901a\u7528\u578b\u6587\u4ef6\u77e5\u8bc6\u5e93\uff0cWeb \u7ad9\u70b9\u6587\u6863\u77e5\u8bc6\u5e93 \u6587\u6863\u7ba1\u7406 \u652f\u6301\u4e0a\u4f20\u6587\u672c\u6587\u4ef6\u6587\u6863\uff0c\u5305\u62ec Markdown\u3001TXT\u3001DOCX\u3001PDF\u3001HTML\u3001XLSX\u3001XLS\u3001CSV \u683c\u5f0f \u652f\u6301\u4e0a\u4f20 QA \u95ee\u7b54\u5bf9\uff0c\u5e76\u63d0\u4f9b QA \u95ee\u7b54\u5bf9\u6a21\u677f \u652f\u6301\u6587\u672c\u6587\u4ef6\u548c\u79bb\u7ebf\u56fe\u7247 ZIP \u683c\u5f0f\u7684\u4e0a\u4f20\u548c\u5bfc\u51fa \u652f\u6301\u77e5\u8bc6\u5e93\u6587\u6863\u7684\u542f\u7528\u72b6\u6001\u8c03\u6574\uff0c\u5f00\u542f\u6216\u5173\u95ed\u6587\u6863 \u652f\u6301\u77e5\u8bc6\u5e93\u6587\u6863\u7684\u547d\u4ee4\u5904\u7406\u65b9\u5f0f\uff0c\u5982\u6a21\u578b\u4f18\u5316\u3001\u76f4\u63a5\u56de\u7b54 \u652f\u6301\u77e5\u8bc6\u5e93\u5bfc\u51fa\u6587\u6863 \u6587\u6863\u5206\u6bb5 \u652f\u6301\u6587\u6863\u667a\u80fd\u5206\u6bb5\u3001\u9ad8\u7ea7\u5206\u6bb5\u65b9\u5f0f \u652f\u6301\u81ea\u5b9a\u4e49\u6b63\u5219\u8868\u8fbe\u5f0f\u5206\u6bb5 \u652f\u6301\u77e5\u8bc6\u5e93\u6587\u6863\u5206\u6bb5\u8fc1\u79fb \u95ee\u9898\u7ba1\u7406 \u652f\u6301\u95ee\u9898\u548c\u6587\u6863\u5206\u6bb5\u5173\u8054 \u652f\u6301\u77e5\u8bc6\u5e93\u81ea\u52a8\u751f\u6210\u5173\u8054\u95ee\u9898 \u5de5\u5177 \u5de5\u5177\u7ba1\u7406 \u652f\u6301\u901a\u8fc7 Python \u51fd\u6570\uff0c\u81ea\u5b9a\u4e49\u5de5\u5177 \u652f\u6301\u4ece\u5de5\u5177\u5546\u5e97\u4e2d\u5bfc\u5165\u521b\u5efa \u652f\u6301\u5de5\u5177\u591a\u7ea7\u76ee\u5f55\u5206\u7c7b\u7ba1\u7406 \u652f\u6301\u5de5\u5177\u7684\u5bfc\u51fa\u548c\u5bfc\u5165 \u6a21\u578b \u6a21\u578b\u4f9b\u5e94\u5546\u5bf9\u63a5 \u652f\u6301\u5bf9\u63a5\u4e3b\u6d41\u7684\u5927\u6a21\u578b\uff0c\u5305\u62ec\u5305\u62ec\u672c\u5730\u79c1\u6709\u5927\u6a21\u578b\uff08Llama 3 / Qwen 2 \u7b49\uff09\u3001\u56fd\u5185\u516c\u5171\u5927\u6a21\u578b\uff08\u901a\u4e49\u5343\u95ee / \u667a\u8c31 AI / \u767e\u5ea6\u5343\u5e06 / Kimi / DeepSeek \u7b49\uff09\u548c\u56fd\u5916\u516c\u5171\u5927\u6a21\u578b\uff08OpenAI / Azure OpenAI / Gemini \u7b49\uff09 \u652f\u6301\u5927\u8bed\u8a00\u6a21\u578b\u3001\u5411\u91cf\u5316\u6a21\u578b\u3001\u91cd\u6392\u6a21\u578b\u3001\u8bed\u97f3\u8bc6\u522b\u3001\u8bed\u97f3\u5408\u6210\u3001\u56fe\u7247\u7406\u89e3\u548c\u56fe\u7247\u751f\u6210\u6a21\u578b \u652f\u6301\u81ea\u5b9a\u4e49\u6a21\u578b\u53c2\u6570\u8bbe\u7f6e \u652f\u6301\u6a21\u578b\u7684\u6743\u9650 \u7cfb\u7edf\u7ba1\u7406 \u7cfb\u7edf\u8bed\u8a00 \u652f\u6301\u7b80\u4f53\u4e2d\u6587\u3001\u7e41\u4f53\u4e2d\u6587\u548c\u82f1\u6587\u4e09\u79cd\u8bed\u8a00 \u7528\u6237\u7ba1\u7406 \u652f\u6301\u7528\u6237\u521b\u5efa/\u5220\u9664\u3001\u542f\u7528/\u7981\u6b62\u3001\u5bc6\u7801\u4fee\u6539 \u652f\u6301 LDAP\u3001CAS\u3001OIDC \u3001OAuth2 \u5bf9\u63a5\uff08X-Pack\uff09 \u652f\u6301\u4f01\u4e1a\u5fae\u4fe1\u3001\u9489\u9489\u3001\u98de\u4e66\u626b\u7801\u767b\u5f55\uff08X-Pack\uff09 \u5de5\u4f5c\u7a7a\u95f4 \u652f\u6301\u6309\u5de5\u4f5c\u7a7a\u95f4\u65b9\u5f0f\u5bf9\u7528\u6237\u3001\u8d44\u6e90\u8fdb\u884c\u72ec\u7acb\u7ba1\u7406\uff08X-Pack\uff09 \u89d2\u8272\u7ba1\u7406 \u652f\u6301\u7cfb\u7edf\u7ba1\u7406\u5458\u3001\u5de5\u4f5c\u7a7a\u95f4\u7ba1\u7406\u5458\u3001\u666e\u901a\u7528\u6237\u5185\u7f6e\u89d2\u8272 \u652f\u6301\u81ea\u5b9a\u4e49\u89d2\u8272\u5e76\u5173\u8054\u6743\u9650\u63a7\u5236\u4ee5\u53ca\u7528\u6237\u6210\u5458\uff08X-Pack\uff09 \u8d44\u6e90\u7ba1\u7406 \u652f\u6301\u67e5\u770b\u5e94\u7528\u3001\u77e5\u8bc6\u5e93\u3001\u5de5\u5177\u548c\u6a21\u578b\u7b49\u6240\u6709\u7cfb\u7edf\u8d44\u6e90\uff08X-Pack\uff09 \u8d44\u6e90\u6388\u6743 \u652f\u6301\u5bf9\u5e94\u7528\u3001\u77e5\u8bc6\u5e93\u3001\u5de5\u5177\u548c\u6a21\u578b\u7b49\u6240\u6709\u7cfb\u7edf\u8d44\u6e90\u6309\u89d2\u8272\u6216\u81ea\u5b9a\u4e49\u6388\u6743 \u5171\u4eab\u8d44\u6e90 \u652f\u6301\u521b\u5efa\u548c\u7ba1\u7406\u77e5\u8bc6\u5e93\u3001\u5de5\u5177\u3001\u6a21\u578b\u7b49\u5171\u4eab\u8d44\u6e90\uff08X-Pack\uff09 \u5bf9\u8bdd\u7528\u6237 \u652f\u6301\u521b\u5efa\u548c\u540c\u6b65\u5bf9\u8bdd\u7528\u6237\uff08X-Pack\uff09 \u652f\u6301\u5bf9\u8bdd\u7528\u6237\u7ec4\u7684\u521b\u5efa\u548c\u6210\u5458\u7ba1\u7406\uff08X-Pack\uff09 \u652f\u6301\u901a\u8fc7 LDAP\u3001CAS\u3001OIDC\u3001OAuth2 \u7b49\u65b9\u5f0f\u8fdb\u884c\u5bf9\u8bdd\u7528\u6237\u7684\u767b\u5f55\u8ba4\u8bc1\uff08X-Pack\uff09 \u7cfb\u7edf\u8bbe\u7f6e \u652f\u6301\u5bf9\u63a5\u90ae\u7bb1 \u652f\u6301\u81ea\u5b9a\u4e49\u7cfb\u7edf Logo \u3001\u767b\u5f55 Logo\u3001\u4e3b\u9898\u914d\u8272\u3001\u767b\u5f55\u80cc\u666f\u56fe\u3001\u7cfb\u7edf\u540d\u79f0\u548c\u6b22\u8fce\u8bed\u4ee5\u53ca\u7cfb\u7edf\u5e2e\u52a9\u94fe\u63a5\uff08X-Pack\uff09 \u652f\u6301\u901a\u8fc7 LDAP\u3001CAS\u3001OIDC\u3001OAuth2\u3001\u626b\u7801\u767b\u5f55\u7b49\u65b9\u5f0f\u8fdb\u884c\u767b\u5f55\u8ba4\u8bc1\uff08X-Pack\uff09 \u64cd\u4f5c\u65e5\u5fd7 \u652f\u6301\u67e5\u770b\u6240\u6709\u7528\u6237\u7684\u64cd\u4f5c\u8be6\u60c5\uff08X-Pack\uff09"},{"location":"contact/","title":"\u8054\u7cfb\u6211\u4eec","text":""},{"location":"contact/#1","title":"1 \u9879\u76ee\u5730\u5740","text":"
  • MaxKB
"},{"location":"contact/#2","title":"2 \u793e\u533a\u8bba\u575b","text":"

\u5927\u5bb6\u53ef\u4ee5\u5728 \u98de\u81f4\u4e91\u5f00\u6e90\u793e\u533a\u8bba\u575b MaxKB \u677f\u5757 \u641c\u7d22\u3001\u54a8\u8be2\u3001\u8ba8\u8bba MaxKB \u667a\u80fd\u4f53\u5e73\u53f0\u76f8\u5173\u95ee\u9898\uff0c\u5e76\u53d1\u8868\u81ea\u5df1\u7684\u89c1\u89e3\u4e0e\u60f3\u6cd5\u3002

"},{"location":"contact/#3","title":"3 \u8054\u7cfb\u65b9\u5f0f","text":"
  • \u5b98\u7f51\uff1ahttps://maxkb.cn
  • \u90ae\u7bb1\uff1asupport@fit2cloud.com
  • \u7535\u8bdd\uff1a400-052-0755
  • \u5fae\u4fe1\u4ea4\u6d41\u7fa4\uff1a
"},{"location":"instructional_video/","title":"\u6559\u5b66\u89c6\u9891","text":""},{"location":"instructional_video/#1","title":"1 \u8bfe\u7a0b\u7b80\u4ecb","text":""},{"location":"instructional_video/#2","title":"2 \u5b89\u88c5\u90e8\u7f72","text":""},{"location":"instructional_video/#3","title":"3 \u529f\u80fd\u6f14\u793a","text":""},{"location":"instructional_video/#4","title":"4 \u4f01\u4e1a\u7248","text":""},{"location":"quick_start/","title":"\u5feb\u901f\u5165\u95e8","text":""},{"location":"quick_start/#1","title":"1 \u5feb\u901f\u90e8\u7f72","text":"
  • \u652f\u6301\u4e3b\u6d41 Linux \u53d1\u884c\u7248\u672c\uff08\u57fa\u4e8e Debian / RedHat\uff0c\u5305\u62ec\u56fd\u4ea7\u64cd\u4f5c\u7cfb\u7edf\uff09
  • \u63a8\u8350\u4f7f\u7528 \u79bb\u7ebf\u5b89\u88c5\u5305 \u8fdb\u884c\u90e8\u7f72\u3002

\u5c06\u4e0b\u8f7d\u7684\u5b89\u88c5\u5305\u4e0a\u4f20\u81f3\u670d\u52a1\u5668\u5e76\u89e3\u538b\uff0c\u5728\u5b89\u88c5\u5305\u76ee\u5f55\u91cc\u6267\u884c\u4ee5\u4e0b\u811a\u672c\u8fdb\u884c\u5feb\u901f\u5b89\u88c5\uff1a

bash install.sh\n

\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u901a\u8fc7\u6d4f\u89c8\u5668\u8bbf\u95ee http://\u76ee\u6807\u670d\u52a1\u5668 IP \u5730\u5740:8080\uff0c\u5e76\u4f7f\u7528\u9ed8\u8ba4\u7684\u7ba1\u7406\u5458\u7528\u6237\u548c\u5bc6\u7801\u767b\u5f55 MaxKB\u3002

\u7528\u6237\u540d\uff1aadmin\n\n\u9ed8\u8ba4\u5bc6\u7801\uff1aMaxKB@123..\n
"},{"location":"quick_start/#2","title":"2 \u754c\u9762\u4ecb\u7ecd","text":"

\u8fdb\u5165 MaxKB \u4e3b\u754c\u9762\u540e\u53ef\u4ee5\u770b\u5230\u754c\u9762\u4e0a\u65b9\u5bfc\u822a\u680f\uff0c\u5305\u542b\u5e94\u7528\u3001\u77e5\u8bc6\u5e93\u3001\u5de5\u5177\u3001\u6a21\u578b\u56db\u5927\u6a21\u5757\u3002

  • \u6a21\u578b\uff1a\u652f\u6301\u5bf9\u63a5\u672c\u5730\u3001\u56fd\u5185\u3001\u56fd\u5916\u4e3b\u6d41\u5927\u6a21\u578b\uff0c\u6db5\u76d6\u6587\u672c\u751f\u6210\u3001\u8bed\u97f3\u8bc6\u522b\u3001\u89c6\u89c9\u8bc6\u522b\u7b49\u591a\u79cd\u7c7b\u578b\uff0c\u6ee1\u8db3\u591a\u573a\u666f\u9700\u6c42\u3002

  • \u5de5\u5177\uff1a\u63d0\u4f9b\u5185\u7f6e\u53ca\u81ea\u5b9a\u4e49\u51fd\u6570\uff0c\u7528\u4e8e\u6570\u636e\u83b7\u53d6\u3001\u903b\u8f91\u5224\u65ad\u3001\u4fe1\u606f\u63d0\u53d6\u7b49\u64cd\u4f5c\uff0c\u521b\u5efa\u540e\u7684\u5de5\u5177\u53ef\u5728\u5e94\u7528\u7f16\u6392\u4e2d\u8c03\u7528\u3002

  • \u77e5\u8bc6\u5e93\uff1a\u521b\u5efa\u548c\u7ba1\u7406\u77e5\u8bc6\u5e93\uff0c\u5305\u62ec\u4e0a\u4f20\u79bb\u7ebf\u6587\u6863\u3001Web \u7ad9\u70b9\u3001\u98de\u4e66\u6587\u6863\u7b49\uff0c\u4e3a\u95ee\u7b54\u5bf9\u8bdd\u63d0\u4f9b\u77e5\u8bc6\u6765\u6e90\uff0c\u5bf9\u77e5\u8bc6\u8fdb\u884c\u7edf\u4e00\u7ba1\u7406\uff0c\u5e76\u52a9\u529b\u667a\u80fd\u95ee\u7b54\u3002

  • \u5e94\u7528\uff1a\u63d0\u4f9b\u9884\u914d\u7f6e\u6a21\u677f\u548c\u7ec4\u4ef6\uff0c\u53ef\u5feb\u901f\u521b\u5efa\u57fa\u7840\u95ee\u7b54\u5e94\u7528\uff0c\u6216\u5bf9\u590d\u6742\u4e1a\u52a1\u6d41\u7a0b\u8fdb\u884c\u9ad8\u7ea7\u7f16\u6392\uff0c\u6253\u9020\u4e13\u5c5e AI \u52a9\u624b\u3002

"},{"location":"quick_start/#3","title":"3 \u5feb\u901f\u4e0a\u624b","text":"

MaxKB \u901a\u8fc7\u63a5\u5165\u5927\u6a21\u578b\u3001\u6784\u5efa\u77e5\u8bc6\u5e93\u3001\u521b\u5efa\u5e94\u7528\uff0c\u4e09\u6b65\u62e5\u6709\u4e13\u5c5e\u7684 AI \u52a9\u624b\u3002\u540c\u65f6\u652f\u6301\u5feb\u901f\u5d4c\u5165\u5404\u7c7b\u7cfb\u7edf\uff0c\u96f6\u7f16\u7801\u5feb\u901f\u96c6\u6210\uff0c\u8ba9\u73b0\u6709\u7cfb\u7edf\u77ac\u95f4\u62e5\u6709 AI \u80fd\u529b\u3002

\u4e0b\u9762\u4ee5\u901a\u7528\u77e5\u8bc6\u5e93\u4e3a\u4f8b\uff0c\u901a\u8fc7\u516c\u6709\u6a21\u578b\u670d\u52a1\u963f\u91cc\u4e91\u767e\u70bc\uff08\u672c\u5730\u6a21\u578b\u90e8\u7f72\u64cd\u4f5c\uff0c\u4f8b\u5982\uff0cDeepSeek \u90e8\u7f72\uff0c\u8bf7\u53c2\u8003\u4f7f\u7528 1Panel \u5f00\u6e90\u9762\u677f\u5feb\u901f\u90e8\u7f72DeepSeek-R1\uff09\uff0c\u5feb\u901f\u521b\u5efa\u667a\u80fd\u95ee\u7b54\u5e94\u7528\u5e76\u53d1\u5e03\u8bf4\u660e\u5177\u4f53\u64cd\u4f5c\u3002

"},{"location":"quick_start/#31","title":"3.1 \u6dfb\u52a0\u6a21\u578b","text":"

\u767b\u5f55 MaxKB \u7cfb\u7edf\u540e\uff0c \u6253\u5f00\u3010\u6a21\u578b\u3011\u9875\u9762\uff0c\u5728\u4f9b\u5e94\u5546\u5217\u8868\u4e2d\u9009\u62e9\u3010\u963f\u91cc\u4e91\u767e\u70bc\u3011\uff0c\u7136\u540e\u70b9\u51fb\u3010\u6dfb\u52a0\u6a21\u578b\u3011\uff0c\u8fdb\u5165\u6a21\u578b\u914d\u7f6e\u8868\u5355\u914d\u7f6e\u53c2\u6570\u5982\u4e0b\uff1a

  • \u6a21\u578b\u540d\u79f0\uff1aMaxKB \u4e2d\u81ea\u5b9a\u4e49\u7684\u6a21\u578b\u540d\u79f0\u3002
  • \u6a21\u578b\u7c7b\u578b\uff1a\u5927\u8bed\u8a00\u6a21\u578b\u3002
  • \u57fa\u7840\u6a21\u578b\uff1a\u963f\u91cc\u4e91\u767e\u70bc\u652f\u6301\u7684 LLM \u6a21\u578b\u540d\u79f0\uff0c\u4e0b\u62c9\u9009\u9879\u662f\u5e38\u7528\u7684\u4e00\u4e9b\u5927\u8bed\u8a00\u6a21\u578b\u540d\u79f0\uff0c\u652f\u6301\u81ea\u5b9a\u4e49\u8f93\u5165\u3002
  • API Key\uff1a\u963f\u91cc\u4e91 DashScope \u7075\u79ef\u6a21\u578b\u670d\u52a1 API Key\u7ba1\u7406\u4e2d\u521b\u5efa\u548c\u67e5\u770b\u3002

\u4e0d\u540c\u7684\u5e73\u53f0\u53c2\u6570\u8981\u6c42\u4e0d\u540c\uff0c\u5176\u5b83\u4f9b\u5e94\u5546\u6a21\u578b\u914d\u7f6e\u6dfb\u52a0\u8be6\u60c5\u89c1\u5404\u6a21\u578b\u5bf9\u63a5\u8be6\u7ec6\u8bf4\u660e\u3002

"},{"location":"quick_start/#32","title":"3.2 \u521b\u5efa\u77e5\u8bc6\u5e93","text":"

\u6253\u5f00\u3010\u77e5\u8bc6\u5e93\u3011\u9875\u9762\uff0c\u70b9\u51fb\u3010\u521b\u5efa\u77e5\u8bc6\u5e93\u3011\uff0c\u8f93\u5165\u77e5\u8bc6\u5e93\u540d\u79f0\u3001\u77e5\u8bc6\u5e93\u63cf\u8ff0\u3001\u9009\u62e9\u5411\u91cf\u6a21\u578b\uff0c\u5e76\u8bbe\u7f6e\u77e5\u8bc6\u5e93\u7c7b\u578b\u4e3a\u901a\u7528\u578b\uff0c\u7136\u540e\u5c06\u79bb\u7ebf\u6587\u6863\u901a\u8fc7\u62d6\u62fd\u65b9\u5f0f\u6216\u9009\u62e9\u6587\u4ef6\u4e0a\u4f20\u65b9\u5f0f\u8fdb\u884c\u4e0a\u4f20\u3002

\u4e0a\u4f20\u6587\u6863\u8981\u6c42\uff1a

  • \u6587\u672c\u6587\u4ef6\uff1aMarkdown\u3001TXT\u3001PDF\u3001DOCX\u3001HTML\u3001XLS\u3001XLSX\u3001CSV\u3001ZIP\uff1b
  • \u8868\u683c\u683c\u5f0f\uff1aExcel\u3001CSV;
  • QA \u95ee\u7b54\u5bf9\uff1aExcel\u3001CSV\uff1b
  • \u9ed8\u8ba4\u6bcf\u6b21\u6700\u591a\u4e0a\u4f20 50 \u4e2a\u6587\u4ef6\uff0c\u6bcf\u4e2a\u6587\u4ef6\u4e0d\u8d85\u8fc7 100 MB\uff0c\u53ef\u914d\u7f6e\uff0c\u4e0a\u4f20\u6587\u4ef6\u6570\u91cf\u6700\u591a\u4e3a 1000\uff0c\u5355\u4e2a\u6587\u6863\u6700\u5927 1000 MB\uff1b
  • \u652f\u6301\u9009\u62e9\u6587\u4ef6\u5939\uff0c\u4e0a\u4f20\u6587\u4ef6\u5939\u4e0b\u7b26\u5408\u683c\u5f0f\u8981\u6c42\u7684\u6587\u4ef6\u3002

\u6587\u6863\u89c4\u8303\u5efa\u8bae\uff1a

  • \u89c4\u8303\u5206\u6bb5\u6807\u8bc6\uff1a\u79bb\u7ebf\u6587\u6863\u7684\u5206\u6bb5\u6807\u8bc6\u8981\u6709\u4e00\u5b9a\u89c4\u8303\uff0c\u5426\u5219\u62c6\u5206\u51fa\u6765\u7684\u6bb5\u843d\u4e0d\u89c4\u6574\u3002
  • \u6bb5\u843d\u8981\u5b8c\u6574\uff1a\u4e00\u4e2a\u5206\u6bb5\u4e2d\u6700\u597d\u80fd\u63cf\u8ff0\u4e00\u4e2a\u5b8c\u6574\u7684\u5185\u5bb9\u3002

MaxKB \u652f\u6301\u667a\u80fd\u5206\u6bb5\u548c\u9ad8\u7ea7\u5206\u6bb5\u4e24\u79cd\u5206\u6bb5\u65b9\u5f0f\u3002

  • \u667a\u80fd\u5206\u6bb5\uff1a\u6309\u7167 Markdown \u683c\u5f0f\u8fdb\u884c\u9010\u7ea7\u4e0b\u94bb\u5f0f\u5206\u6bb5\uff08\u6700\u591a\u652f\u6301 6 \u7ea7\u6807\u9898\uff09\uff0c\u6bcf\u6bb5\u6700\u5927\u5b57\u7b26\u6570\u4e3a 4096 \u4e2a\uff1b

  • \u9ad8\u7ea7\u5206\u6bb5\uff1a\u652f\u6301\u81ea\u5b9a\u4e49\u8bbe\u7f6e\u5206\u6bb5\u6807\u8bc6\u7b26\u3001\u5206\u6bb5\u957f\u5ea6\u53ca\u81ea\u52a8\u6e05\u6d17\u3002\u5206\u6bb5\u6807\u8bc6\u8fd8\u652f\u6301\u4f7f\u7528\u6b63\u5219\u8868\u8fbe\u5f0f\u5904\u7406\u590d\u6742\u7ed3\u6784\u6587\u6863\u3002

\u5bfc\u5165\u65f6\u6dfb\u52a0\u5206\u6bb5\u6807\u9898\u4e3a\u5173\u8054\u95ee\u9898\uff0c\u52fe\u9009\u540e\u4f1a\u628a\u6240\u6709\u5206\u6bb5\u7684\u6807\u9898\u8bbe\u7f6e\u4e3a\u5206\u6bb5\u7684\u5173\u8054\u95ee\u9898\u3002

\u70b9\u51fb\u3010\u521b\u5efa\u5e76\u5bfc\u5165\u3011\u540e\uff0c\u7cfb\u7edf\u540e\u53f0\u4f1a\u5bf9\u6587\u6863\u8fdb\u884c\u81ea\u52a8\u5206\u6bb5 \u3001\u5b58\u50a8\u3001\u5411\u91cf\u5316\u5904\u7406\u64cd\u4f5c\uff0c\u6267\u884c\u5b8c\u6210\u540e\u5728\u77e5\u8bc6\u5e93\u6587\u6863\u5217\u8868\u4e2d\u5404\u4e2a\u6587\u4ef6\u72b6\u6001\u663e\u793a\u4e3a\u3010\u6210\u529f\u3011\u3002

"},{"location":"quick_start/#33","title":"3.3 \u521b\u5efa\u5e94\u7528","text":"

\u70b9\u51fb\u3010\u521b\u5efa\u3011\uff0c\u9009\u62e9\u5e94\u7528\u7c7b\u578b\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u540e\u70b9\u51fb\u3010\u521b\u5efa\u3011\u3002

  • \u7b80\u5355\u914d\u7f6e\uff1a\u63d0\u4f9b\u57fa\u7840\u7684\u529f\u80fd\u548c\u8bbe\u7f6e\u9009\u9879\uff0c\u53ef\u6ee1\u8db3\u5927\u591a\u6570\u57fa\u672c\u7684\u95ee\u7b54\u9700\u6c42\uff0c\u9002\u7528\u4e8e\u9700\u8981\u5feb\u901f\u4e0a\u7ebf\u667a\u80fd\u4f53\u5e94\u7528\u3002
  • \u9ad8\u7ea7\u7f16\u6392\uff1a\u901a\u8fc7\u57fa\u7840\u7ec4\u4ef6\u3001\u5de5\u5177\u4ee5\u53ca\u5e94\u7528\u5d4c\u5957\u8fdb\u884c\u529f\u80fd\u548c\u903b\u8f91\u7684\u7f16\u6392\uff0c\u8bbe\u8ba1\u5de5\u4f5c\u6d41\u7a0b\uff0c\u6ee1\u8db3\u5404\u7c7b\u590d\u6742\u4e1a\u52a1\u573a\u666f\u7684\u9700\u6c42\u3002

\u5e94\u7528\u521b\u5efa\u5b8c\u6210\uff0c\u8fdb\u5165\u3010\u7b80\u5355\u914d\u7f6e\u3011\u914d\u7f6e\u5e94\u7528\u7684\u8bbe\u7f6e\u9875\u9762\uff0c\u5de6\u4fa7\u4e3a\u5e94\u7528\u4fe1\u606f\uff0c\u53f3\u4fa7\u4e3a\u8c03\u8bd5\u9884\u89c8\u754c\u9762\u3002

  • \u540d\u79f0\uff1a\u7528\u6237\u63d0\u95ee\u65f6\u5bf9\u8bdd\u6846\u7684\u6807\u9898\u548c\u540d\u5b57\u3002
  • \u63cf\u8ff0\uff1a\u5bf9\u5e94\u7528\u573a\u666f\u53ca\u7528\u9014\u7684\u63cf\u8ff0\u3002
  • AI \u6a21\u578b\uff1a\u5728\u3010\u7cfb\u7edf\u8bbe\u7f6e\u3011-\u3010\u6a21\u578b\u7ba1\u7406\u3011\u4e2d\u6dfb\u52a0\u7684\u5927\u8bed\u8a00\u6a21\u578b\u3002
  • \u7cfb\u7edf\u89d2\u8272\uff1aAI \u6a21\u578b\u5728\u4ea4\u4e92\u4e2d\u88ab\u9884\u8bbe\u7684\u8eab\u4efd\u3001\u529f\u80fd\u4ee5\u53ca\u884c\u4e3a\u8fb9\u754c\u3002
  • \u63d0\u793a\u8bcd\uff1a\u7cfb\u7edf\u9ed8\u8ba4\u6709\u667a\u80fd\u77e5\u8bc6\u5e93\u7684\u63d0\u793a\u8bcd\uff0c\u7528\u6237\u53ef\u4ee5\u81ea\u5b9a\u4e49\u901a\u8fc7\u8c03\u6574\u63d0\u793a\u8bcd\u5185\u5bb9\uff0c\u5f15\u5bfc\u5927\u6a21\u578b\u804a\u5929\u65b9\u5411\u3002\u53ef\u5bf9\u65e0\u5f15\u7528\u77e5\u8bc6\u5e93\u548c\u5f15\u7528\u77e5\u8bc6\u5e93\u4e24\u79cd\u60c5\u51b5\u5206\u522b\u8bbe\u7f6e\u4e0d\u540c\u7684\u63d0\u793a\u8bcd\u3002
  • \u5386\u53f2\u804a\u5929\u8bb0\u5f55\uff1a\u5927\u6a21\u578b\u63d0\u4ea4\u5f53\u524d\u4f1a\u8bdd\u4e2d\u6700\u540e N \u6761\u5bf9\u8bdd\u5185\u5bb9\uff0c\u5982\u679c\u4e3a 0\uff0c\u5219\u4ec5\u5411\u5927\u6a21\u578b\u63d0\u4ea4\u5f53\u524d\u95ee\u9898\u3002
  • \u5173\u8054\u77e5\u8bc6\u5e93\uff1a\u7528\u6237\u63d0\u95ee\u540e\u5c06\u5728\u5173\u8054\u7684\u77e5\u8bc6\u5e93\u4e2d\u68c0\u7d22\u5206\u6bb5\u3002
  • \u5f00\u573a\u767d\uff1a\u7528\u6237\u6253\u5f00\u5bf9\u8bdd\u65f6\uff0c\u7cfb\u7edf\u5f39\u51fa\u7684\u95ee\u5019\u8bed\u3002\u652f\u6301 Markdown \u683c\u5f0f\uff1b[-]\u540e\u7684\u5185\u5bb9\u4e3a\u5feb\u6377\u95ee\u9898\uff0c\u4e00\u884c\u4e00\u4e2a\u3002
  • \u8f93\u51fa\u601d\u8003\uff1a\u5bf9\u5927\u8bed\u8a00\u6a21\u578b\u7684\u601d\u8003\u8fc7\u7a0b\u662f\u5426\u8f93\u51fa\u8fdb\u884c\u914d\u7f6e\u3002
  • \u8bed\u97f3\u8f93\u5165\uff1a\u5f00\u542f\u540e\u5c06\u652f\u6301\u8bed\u97f3\u65b9\u5f0f\u8fdb\u884c\u63d0\u95ee\uff0c\u9700\u8981\u8bed\u97f3\u8bc6\u522b\u6a21\u578b\u652f\u6301\u3002
  • \u8bed\u97f3\u64ad\u653e\uff1a\u5f00\u542f\u540e\u53ef\u4ee5\u901a\u8fc7\u8bed\u97f3\u8fdb\u884c\u64ad\u653e\u56de\u7b54\uff0c\u53ef\u4ee5\u901a\u8fc7\u6d4f\u89c8\u5668\u64ad\u653e\uff0c\u4e5f\u53ef\u4ee5\u901a\u9009\u62e9\u8bed\u97f3\u5408\u6210\u6a21\u578b\u3002

\u5e94\u7528\u4fe1\u606f\u8bbe\u7f6e\u5b8c\u6210\u540e\uff0c\u53ef\u4ee5\u5728\u53f3\u4fa7\u8c03\u8bd5\u9884\u89c8\u4e2d\u8fdb\u884c\u6d4b\u8bd5\u9a8c\u8bc1\uff0c\u8c03\u8bd5\u9884\u89c8\u4e2d\u7684\u63d0\u95ee\u5185\u5bb9\u4e0d\u8ba1\u5165\u5bf9\u8bdd\u65e5\u5fd7\u3002

\u77e5\u8bc6\u5e93\u53c2\u6570\u8bbe\u7f6e\u8be6\u7ec6\u8bf4\u660e\uff1a

  • \u68c0\u7d22\u6a21\u5f0f

    • \u5411\u91cf\u68c0\u7d22\uff1a\u4f7f\u7528\u5411\u91cf\u6a21\u578b\u901a\u8fc7\u5411\u91cf\u8ddd\u79bb\u8ba1\u7b97\u4e0e\u7528\u6237\u95ee\u9898\u6700\u76f8\u4f3c\u7684\u6587\u672c\u5206\u6bb5\uff1b
    • \u5168\u6587\u68c0\u7d22\uff1a\u901a\u8fc7\u5173\u952e\u8bcd\u68c0\u7d22\uff0c\u8fd4\u56de\u5305\u542b\u5173\u952e\u8bcd\u6700\u591a\u7684\u6587\u672c\u5206\u6bb5\uff1b
    • \u6df7\u5408\u68c0\u7d22\uff1a\u540c\u65f6\u6267\u884c\u5168\u6587\u68c0\u7d22\u548c\u5411\u91cf\u68c0\u7d22\uff0c\u518d\u8fdb\u884c\u91cd\u6392\u5e8f\uff0c\u4ece\u4e24\u7c7b\u67e5\u8be2\u7ed3\u679c\u4e2d\u9009\u62e9\u5339\u914d\u7528\u6237\u95ee\u9898\u7684\u6700\u4f73\u7ed3\u679c\u3002
  • \u76f8\u4f3c\u5ea6\uff1a \u76f8\u4f3c\u5ea6\u8d8a\u9ad8\u4ee3\u8868\u95ee\u9898\u548c\u5206\u6bb5\u7684\u76f8\u5173\u6027\u8d8a\u5f3a\u3002

  • \u5f15\u7528\u5206\u6bb5\u6570 TOP\uff1a \u63d0\u95ee\u65f6\u6309\u76f8\u4f3c\u5ea6\u643a\u5e26 N \u4e2a\u5206\u6bb5\u751f\u6210\u63d0\u793a\u8bcd\u8be2\u95ee LLM \u6a21\u578b\u3002

  • \u6700\u591a\u5f15\u7528\u5b57\u7b26\u6570\uff1a \u5f15\u7528\u5206\u6bb5\u5185\u5bb9\u8bbe\u7f6e\u6700\u5927\u5b57\u7b26\u6570\uff0c\u8d85\u8fc7\u65f6\u5219\u622a\u65ad\u3002

  • \u65e0\u5f15\u7528\u77e5\u8bc6\u5e93\u5904\u7406

    • \u7ee7\u7eed\u5411 AI \u6a21\u578b\u63d0\u95ee\uff1a\u5373\u6ca1\u6709\u547d\u4e2d\u77e5\u8bc6\u5e93\u5206\u6bb5\u65f6\u7ee7\u7eed\u7531\u5927\u6a21\u578b\u63d0\u95ee\uff0c\u7531\u5927\u6a21\u578b\u81ea\u884c\u56de\u7b54\uff0c\u8fd9\u6709\u53ef\u80fd\u9020\u6210\u5e7b\u89c9\u3002
    • \u6307\u5b9a\u56de\u590d\u5185\u5bb9\uff1a\u5f53\u6ca1\u6709\u547d\u4e2d\u77e5\u8bc6\u5e93\u5206\u6bb5\u65f6\u53ef\u4ee5\u6307\u5b9a\u56de\u590d\u5185\u5bb9\uff0c\u8fdb\u4e00\u6b65\u5f15\u5bfc\u3002
  • \u95ee\u9898\u4f18\u5316\uff1a \u5f00\u542f\u540e\u5bf9\u7528\u6237\u63d0\u51fa\u7684\u95ee\u9898\u5148\u8fdb\u884c\u4e00\u6b21 LLM \u4f18\u5316\u5904\u7406\uff0c\u7136\u540e\u6839\u636e\u95ee\u9898\u4f18\u5316\u540e\u7684\u7ed3\u679c\u5728\u77e5\u8bc6\u5e93\u4e2d\u8fdb\u884c\u68c0\u7d22\u3002

\u4fdd\u5b58\u8bbe\u7f6e\u5e76\u53d1\u5e03\u540e\uff0c\u5728\u5e94\u7528\u5217\u8868\u9875\u9762\u7684\u6982\u89c8\u9875\u9762\u70b9\u51fb\u3010\u53bb\u5bf9\u8bdd\u3011\u6216\u5728\u6d4f\u89c8\u5668\u4e2d\u590d\u5236\u516c\u5f00\u8bbf\u95ee\u94fe\u63a5\u8fdb\u5165\u95ee\u7b54\u9875\u9762\u8fdb\u884c\u63d0\u95ee\u3002

"},{"location":"quick_start/#34","title":"3.4 \u5e94\u7528\u96c6\u6210","text":"

MaxKB \u5e94\u7528\u652f\u6301\u96f6\u7f16\u7801\u5feb\u901f\u5d4c\u5165\u7b2c\u4e09\u65b9 Web \u7cfb\u7edf\u3002

\u5728\u5e94\u7528\u6982\u89c8\u9875\u9762\uff0c\u70b9\u51fb\u3010\u5d4c\u5165\u7b2c\u4e09\u65b9\u3011\uff0c\u590d\u5236\u5bf9\u5e94\u7684\u5d4c\u5165\u4ee3\u7801\uff0c\u4ee5\u5168\u5c4f\u6a21\u5f0f\u6216\u6d6e\u7a97\u6a21\u5f0f\u5d4c\u5165\u5230\u7b2c\u4e09\u65b9\u7cfb\u7edf\u4e2d\uff0c\u5d4c\u5165\u5b8c\u6210\u540e\u4fbf\u53ef\u5728\u7b2c\u4e09\u65b9\u7cfb\u7edf\u4e2d\u8fdb\u884c\u95ee\u7b54\u3002

MaxKB \u5e94\u7528\u4e5f\u652f\u6301\u63a5\u5165\u4f01\u4e1a\u5fae\u4fe1\u3001\u516c\u4f17\u53f7\u3001\u9489\u9489\u548c\u98de\u4e66\u7b49\u79fb\u52a8\u7aef\u5e94\u7528\uff0c\u8be6\u7ec6\u8bf4\u660e\u89c1\uff1aX-Pack\u529f\u80fd-\u5e94\u7528\u63a5\u5165 \u3002

"},{"location":"system_arch/","title":"\u7cfb\u7edf\u67b6\u6784","text":""},{"location":"system_arch/#1","title":"1 \u6574\u4f53\u67b6\u6784","text":""},{"location":"system_arch/#2","title":"2 \u6280\u672f\u6808","text":"
  • \u524d\u7aef\uff1aVue.js\u3001LogicFlow
  • \u540e\u7aef\uff1aPython / Django\u3001langchain
  • \u5411\u91cf\u6570\u636e\u5e93\uff1aPostgreSQL / pgvector\u3001Redis
  • \u5927\u6a21\u578b\uff1aDeepSeek\u3001\u901a\u4e49\u5343\u95ee\u3001Kimi\u3001\u767e\u5ea6\u5343\u5e06\u3001\u8baf\u98de\u661f\u706b\u3001\u667a\u8c31AI\u3001OpenAI\u3001Azure OpenAI\u3001Anthropic\u3001Gemini\u3001Ollama\u7b49\u3002
"},{"location":"dev_manual/APIKey_chat/","title":"APIKey chat","text":"

MaxKB \u521b\u5efa\u7684\u5e94\u7528\u652f\u6301\u901a\u8fc7 OpenAI SDK \u683c\u5f0f\u4ee5\u53ca\u63d0\u4f9b\u7cfb\u7edf SDK \u63a5\u5165\uff0c\u4e13\u4e1a\u7248\u5728\u793e\u533a\u7248\u672c\u57fa\u7840\u4e0a\u63d0\u4f9b\u5e73\u53f0\u7ea7\u522b\u7684\u5b8c\u6574 SDK\uff0c\u8be6\u7ec6\u60c5\u51b5\u89c1\uff1a\u7cfb\u7edfAPI\u3002

"},{"location":"dev_manual/APIKey_chat/#1-openai-api","title":"1 \u6807\u51c6OpenAI API\u683c\u5f0f","text":"

MaxKB \u5e94\u7528\u517c\u5bb9 OpenAI API \u683c\u5f0f\uff0c\u5728 OpenAI API \u539f\u6709\u8c03\u7528\u65b9\u5f0f\u7684\u57fa\u7840\u4e0a\u66ff\u6362\u4e3a MaxKB \u5e94\u7528\u63d0\u4f9b\u7684 Base URL \u4ee5\u53ca API Key \u5373\u53ef\u3002

# \u5c06 url \u548c Authorization \u66ff\u6362\u4e3a MaxKB \u5e94\u7528\u5b9e\u9645\u771f\u5b9e\u7684 Base URL \u548c API Key\u3002\n\ncurl https://maxkb.fit2cloud.com/api/application/xxxxxxxx-8c56-11ef-a99e-0242ac140003/chat/completions \\\n    -H \"Content-Type: application/json\" \\\n    -H \"Authorization: Bearer application-xxxxxxxxf00e21a7530d1177c20967\"  \\\n    -d '{\n        \"model\": \"gpt-3.5-turbo\",\n        \"messages\": [\n            {\n              \"role\": \"\u4f60\u662f\u676d\u5dde\u98de\u81f4\u4e91\u4fe1\u606f\u79d1\u6280\u6709\u9650\u516c\u53f8\u65d7\u4e0b\u4ea7\u54c1 MaxKB \u77e5\u8bc6\u5e93\u95ee\u7b54\u7cfb\u7edf\u7684\u667a\u80fd\u5c0f\u52a9\u624b\uff0c\u4f60\u7684\u5de5\u4f5c\u662f\u5e2e\u52a9 MaxKB \u7528\u6237\u89e3\u7b54\u4f7f\u7528\u4e2d\u9047\u5230\u7684\u95ee\u9898\uff0c\u7528\u6237\u627e\u4f60\u56de\u7b54\u95ee\u9898\u65f6\uff0c\u4f60\u8981\u628a\u4e3b\u9898\u653e\u5728 MaxKB \u77e5\u8bc6\u5e93\u95ee\u7b54\u7cfb\u7edf\u8eab\u4e0a\u3002\",\n              \"content\": \"MaxKB \u662f\u4ec0\u4e48\uff1f\"\n            }\n        ]\n    }'\n
"},{"location":"dev_manual/APIKey_chat/#2-api","title":"2 \u7cfb\u7edf API","text":""},{"location":"dev_manual/APIKey_chat/#21-api","title":"2.1 \u6253\u5f00 API \u6587\u6863","text":"

\u5728\u5e94\u7528\u4fe1\u606f\u4e2d\u590d\u5236\u5e76\u8bbf\u95ee swagger \u5730\u5740\u3002

"},{"location":"dev_manual/APIKey_chat/#22-api-key","title":"2.2 API Key \u8ba4\u8bc1","text":""},{"location":"dev_manual/APIKey_chat/#23","title":"2.3 \u83b7\u53d6\u5e94\u7528\u4fe1\u606f","text":"

\u8c03\u7528 profile \u63a5\u53e3\uff0c\u83b7\u53d6\u5e94\u7528\u8be6\u7ec6\u4fe1\u606f\uff08\u5e94\u7528 id\u3001name \u7b49\uff09\u3002

"},{"location":"dev_manual/APIKey_chat/#24","title":"2.4 \u6253\u5f00\u4f1a\u8bdd","text":"

\u8c03\u7528\u6253\u5f00\u4f1a\u8bdd\u63a5\u53e3\uff0c\u8f93\u5165\u4e0a\u8ff0\u6b65\u9aa4\u83b7\u53d6\u7684\u5e94\u7528 id\uff0c\u6253\u5f00\u4f1a\u8bdd\u5e76\u83b7\u53d6\u4f1a\u8bdd id\u3002

"},{"location":"dev_manual/APIKey_chat/#25","title":"2.5 \u8fdb\u884c\u5bf9\u8bdd","text":"

\u8c03\u7528\u5bf9\u8bdd\u63a5\u53e3\uff0c\u8f93\u5165\u4f1a\u8bdd id \u8fdb\u884c\u5bf9\u8bdd\u3002

"},{"location":"dev_manual/dev_environment/","title":"\u5f00\u53d1\u73af\u5883\u642d\u5efa","text":""},{"location":"dev_manual/dev_environment/#1","title":"1 \u9879\u76ee\u7ed3\u6784","text":"
.          \n\u251c\u2500\u2500 LICENSE                 # License \u7533\u660e        \n\u251c\u2500\u2500 README.md           \n\u251c\u2500\u2500 apps                    # \u540e\u7aef\u9879\u76ee\u6839\u76ee\u5f55        \n\u2502 \u251c\u2500\u2500 application           # \u5e94\u7528\n\u2502 \u251c\u2500\u2500 common                # \u9879\u76ee\u516c\u5171\u8d44\u6e90\u76ee\u5f55\n\u2502 \u251c\u2500\u2500 dataset               # \u77e5\u8bc6\u5e93\n\u2502 \u251c\u2500\u2500 embedding             # \u5411\u91cf\u5316\n\u2502 \u251c\u2500\u2500 function_lib          # \u51fd\u6570\u5e93\n\u2502 \u251c\u2500\u2500 ops                   # \n\u2502 \u251c\u2500\u2500 setting               # \u8bbe\u7f6e\n\u2502 \u251c\u2500\u2500 smartdoc              # \u9879\u76ee\u4e3b\u76ee\u5f55          \n\u2502 \u251c\u2500\u2500 users                 # \u7528\u6237\u76f8\u5173          \n\u2502 \u2514\u2500\u2500 manage.py             # django\u9879\u76ee\u5165\u53e3         \n\u251c\u2500\u2500 installer               # \u5b89\u88c5\u76f8\u5173  \n\u251c\u2500\u2500 pyproject.toml          # \u540e\u7aef\u4f9d\u8d56 \u914d\u7f6e\u6587\u4ef6         \n\u2514\u2500\u2500 ui                      # \u524d\u7aef\u9879\u76ee\u6839\u76ee\u5f55          \n\u251c\u2500\u2500 config_example.yml      # \u9879\u76ee\u914d\u7f6e\u793a\u4f8b             \n\u251c\u2500\u2500 main.py                 # \u9879\u76ee\u5165\u53e3\u6587\u4ef6              \n
"},{"location":"dev_manual/dev_environment/#2","title":"2 \u73af\u5883\u51c6\u5907","text":"
  • \u524d\u7aef\u73af\u5883\u51c6\u5907 \u5b89\u88c5 node \uff0cv16\u53ca\u4ee5\u4e0a\u7248\u672c
  • \u540e\u7aef\u73af\u5883\u51c6\u5907 \u5b89\u88c5 python \uff0c\u7248\u672c v3.11.x \u5b89\u88c5 pycharm
  • \u6570\u636e\u5e93 \u5b89\u88c5 PostgreSql \uff0c\u7248\u672c v15.x
"},{"location":"dev_manual/dev_environment/#3","title":"3 \u672c\u5730\u914d\u7f6e","text":""},{"location":"dev_manual/dev_environment/#31","title":"3.1 \u521b\u5efa\u6570\u636e\u5e93","text":"

\u5728 PostgreSql \u4e2d\u624b\u52a8\u521b\u5efa MaxKB \u5e94\u7528\u6570\u636e\u5e93\uff0c\u540d\u79f0\u4e3amaxkb\u3002

# \u521b\u5efa\u6570\u636e\u5e93\nCREATE DATABASE \"maxkb\"; \n# \u5207\u6362\u4f7f\u7528\u6570\u636e\u5e93\n\\c \"maxkb\"; \n# \u521b\u5efa vector \u6269\u5c55\nCREATE EXTENSION \"vector\";\n

"},{"location":"dev_manual/dev_environment/#32","title":"3.2 \u914d\u7f6e\u6587\u4ef6","text":"

\u9879\u76ee\u542f\u52a8\u4e4b\u524d\uff0c\u9700\u8981\u51c6\u5907\u914d\u7f6e\u6587\u4ef6\u53ca\u76ee\u5f55

  • \u51c6\u5907\u914d\u7f6e\u6587\u4ef6
# \u5c06 config_example.yml \u914d\u7f6e\u6587\u4ef6\u62f7\u8d1d\u81f3 /opt/maxkb/conf \u76ee\u5f55\u4e0b\ncp config_example.yml /opt/maxkb/conf\n
  • \u914d\u7f6e /opt/maxkb/conf/config_example.yml
# \u6570\u636e\u5e93\u914d\u7f6e\uff08\u5c06\u4ee5\u4e0b\u4fe1\u606f\u66ff\u6362\u4e3a\u5b9e\u9645\u73af\u5883\u4fe1\u606f\uff09\nDB_NAME: maxkb\nDB_HOST: localhost\nDB_PORT: 5432\nDB_USER: root\nDB_PASSWORD: xxx\nDB_ENGINE: django.db.backends.postgresql_psycopg2\n\n# \u6a21\u578b\u76f8\u5173\u914d\u7f6e\n# \u6a21\u578b\u8def\u5f84:\u5982\u679c EMBEDDING_MODEL_NAME \u662f\u7edd\u5bf9\u8def\u5f84\u5219\u65e0\u6548,\u53cd\u4e4b\u5219\u4f1a\u4ece https://huggingface.co/ \u4e0b\u8f7d\u6a21\u578b\u5230\u5f53\u524d\u76ee\u5f55\nEMBEDDING_MODEL_PATH: /opt/maxkb/model/\n# \u6a21\u578b\u540d\u79f0:\u5982\u679c\u6a21\u578b\u540d\u79f0\u662f\u8def\u5f84,\u5219\u4f1a\u52a0\u8f7d\u76ee\u5f55\u4e0b\u7684\u6a21\u578b,\u5982\u679c\u662f\u6a21\u578b\u540d\u79f0,\u5219\u4f1a\u5728 https://huggingface.co/ \u4e0b\u8f7d\u6a21\u578b \u6a21\u578b\u7684\u4e0b\u8f7d\u4f4d\u7f6e\u4e3a EMBEDDING_MODEL_PATH\nEMBEDDING_MODEL_NAME: /opt/maxkb/model/shibing624_text2vec-base-chinese\n
"},{"location":"dev_manual/dev_environment/#4","title":"4 \u5f00\u53d1\u8c03\u8bd5","text":""},{"location":"dev_manual/dev_environment/#41","title":"4.1 \u542f\u52a8\u524d\u7aef","text":"
# \u5728 `ui`\u76ee\u5f55 \u6267\u884c\u5b89\u88c5\u524d\u7aef\u9700\u8981\u7684\u4f9d\u8d56\nnpm install\n\n# \u7136\u540e\u542f\u52a8\u9879\u76ee\nnpm run dev\n

\u542f\u52a8\u6210\u529f\u540e\uff0c\u5982\u4e0b\u56fe\u663e\u793a\u3002

"},{"location":"dev_manual/dev_environment/#42","title":"4.2 \u542f\u52a8\u540e\u7aef","text":"

\u540e\u7aef\u7cfb\u7edf\uff0c\u9700\u8981\u542f\u52a8 web\u670d\u52a1\u3001\u672c\u5730\u6a21\u578b\u670d\u52a1\u3001\u548c\u5f02\u6b65\u4efb\u52a1\u961f\u5217\u670d\u52a1\u3002 \u6ce8\u610f\uff1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u6267\u884c

\u5728 MaxKB \u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u4f9d\u6b21\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff0c\u542f\u52a8 Web \u670d\u52a1\u3002

# \u5b89\u88c5 poetry \u5305\u7ba1\u7406\u5668\npip install poetry\n\n# \u5b89\u88c5\u540e\u7aef\u9700\u8981\u7684\u4f9d\u8d56\npoetry install\n* \u6ce8\u610f\uff1a\u5982\u679c\u5728\u56fd\u5185\u5b89\u88c5\uff0c\u9700\u8981\u914d\u7f6e poetry \u7684\u6e90\uff0c\u5426\u5219\u4e0b\u8f7d\u975e\u5e38\u6162\uff0c\u7ecf\u5e38\u65e0\u6cd5\u6b63\u5e38\u5b89\u88c5\uff0c\u914d\u7f6e\u547d\u4ee4\u4e3a\uff1a`poetry source add --priority=primary mirrors http://mirrors.aliyun.com/pypi/simple`\n\n# \u542f\u52a8\u9879\u76ee\npython main.py start\n

\u5728 MaxKB \u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u4f9d\u6b21\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff0c\u542f\u52a8\u672c\u5730\u6a21\u578b\u670d\u52a1\u3002

# \u542f\u52a8\u9879\u76ee\npython main.py dev local_model\n

\u5728 MaxKB \u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u4f9d\u6b21\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff0c\u542f\u52a8\u5f02\u6b65\u4efb\u52a1\u670d\u52a1\u3002

# \u542f\u52a8\u9879\u76ee\npython main.py dev celery\n

"},{"location":"dev_manual/dev_environment/#5","title":"5 \u8bbf\u95ee\u9879\u76ee","text":"

\u524d\u540e\u7aef\u90fd\u542f\u52a8\u6210\u529f\u540e\uff0c\u5c31\u53ef\u4ee5\u901a\u8fc7\u524d\u7aef\u8def\u7531\uff08\u524d\u7aef\u542f\u52a8\u51fa\u73b0\u7684\u8bbf\u95ee\u5730\u5740\uff09\u5728\u6d4f\u89c8\u5668\u4e2d\u8fdb\u884c\u8bbf\u95ee\u3002

"},{"location":"faq/GPU_runOllama/","title":"\u5982\u4f55\u8ba9 Ollama \u4f7f\u7528 GPU \u8fd0\u884c LLM \u6a21\u578b","text":"

\u4ee5 NVIDIA \u4e3a\u4f8b\uff0c\u8bf4\u660e Ollama GPU \u6a21\u5f0f\u8fd0\u884c\u5927\u6a21\u578b\u7684\u5177\u4f53\u64cd\u4f5c\u3002

"},{"location":"faq/GPU_runOllama/#1","title":"1 \u5b89\u88c5\u82f1\u4f1f\u8fbe\u5bb9\u5668\u5b89\u88c5\u5305","text":"

\u4ee5 Ubuntu 22.04 \u4e3a\u4f8b\uff08\u5176\u5b83\u7cfb\u7edf\u8bf7\u53c2\u8003\uff1a\u82f1\u4f1f\u8fbe\u5b98\u65b9\u6587\u6863\uff09

  • \u914d\u7f6e apt \u6e90
    curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \\\n&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \\\n    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \\\n    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list\n
  • \u66f4\u65b0\u6e90
    sudo apt-get update\n
  • \u5b89\u88c5\u5de5\u5177\u5305
    sudo apt-get install -y nvidia-container-toolkit\n
"},{"location":"faq/GPU_runOllama/#2-gpu-ollama","title":"2 \u4f7f\u7528 GPU \u8fd0\u884c Ollama","text":"
# \u4ee5\u540e\u53f0\u6a21\u5f0f\u8fd0\u884c ollama \u5bb9\u5668\uff0c\u5e76\u5141\u8bb8\u5bb9\u5668\u8bbf\u95ee\u4e3b\u673a\u4e0a\u6240\u6709\u53ef\u7528\u7684 NVIDIA GPU\ndocker run --gpus all -d -v /opt/ai/ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama\n
"},{"location":"faq/GPU_runOllama/#3-ollama","title":"3 \u4f7f\u7528 Ollama \u4e0b\u8f7d\u6a21\u578b","text":"
# \u5728\u7ebf\u4e0b\u8f7d\u5e76\u8fd0\u884c\u6a21\u578b\ndocker exec -it ollama ollama run qwen:7b\n
"},{"location":"faq/GPU_runOllama/#4-maxkb-ollama","title":"4 \u5728 MaxKB \u4e2d\u6dfb\u52a0 Ollama \u6a21\u578b","text":"

\u4e0b\u8f7d\u5b8c\u6210\u5e76\u8fd0\u884c\u6a21\u578b\u670d\u52a1\u540e\uff0c\u5373\u53ef\u5728 MaxKB \u4e2d\u6dfb\u52a0\u5bf9\u5e94\u7684\u6a21\u578b\u5e76\u4f7f\u7528\u3002

"},{"location":"faq/MaxKB%20VS.Dify/","title":"MaxKB VS.Dify","text":"

MaxKB \u548c Dify \u90fd\u662f\u57fa\u4e8e\u5927\u8bed\u8a00\u6a21\u578b\u6280\u672f\u7684\u5f00\u6e90\u9879\u76ee\uff0c\u4e24\u8005\u5728\u4ea7\u54c1\u5b9a\u4f4d\u4ee5\u53ca\u80fd\u529b\u4e0a\u5b58\u5728\u5dee\u5f02\uff1a

  • \u4ea7\u54c1\u5b9a\u4f4d\u4e0d\u540c\uff1aDify \u5b9a\u4f4d\u4e8e\u5927\u6a21\u578b\u5e94\u7528\u7684\u5f00\u53d1\u5e73\u53f0\uff0c\u5c5e\u4e8e\u4e2d\u95f4\u4ef6\u8303\u7574\uff1bMaxKB \u5b9a\u4f4d\u4e8e\u57fa\u4e8e\u5927\u6a21\u578b\u548c RAG \u7684\u667a\u80fd\u95ee\u7b54\u52a9\u624b\uff0c\u5c5e\u4e8e\u5f00\u7bb1\u5373\u7528\u7684\u6700\u7ec8\u5e94\u7528\u3002
  • \u4ea7\u54c1\u80fd\u529b\u5bf9\u6bd4\uff1a\u4ee5\u4e0b\u8868\u683c\u662f Dify \u5b98\u65b9\u63d0\u4f9b\u7684\u4e0e LangChain\u3001Flowise \u7b49\u4ea7\u54c1\u7684\u80fd\u529b\u5bf9\u6bd4\uff1bMaxKB \u662f\u57fa\u4e8e LangChain \u6784\u5efa\u7684\u5e94\u7528\uff0c\u5e76\u8865\u9f50\u4e86 LangChain \u5728 Workflow \u548c SSO \u7b49\u4f01\u4e1a\u7ea7\u529f\u80fd\u4e0a\u9762\u7684\u7a7a\u767d\u3002

\u529f\u80fd Dify.AI LangChain Flowise OpenAI Assistant API MaxKB(Built on LangChain) \u7f16\u7a0b\u65b9\u6cd5 API + \u5e94\u7528\u7a0b\u5e8f\u5bfc\u5411 Python \u4ee3\u7801 \u5e94\u7528\u7a0b\u5e8f\u5bfc\u5411 API \u5bfc\u5411 API + \u5e94\u7528\u7a0b\u5e8f\u5bfc\u5411 \u652f\u6301\u7684 LLMs \u4e30\u5bcc\u591a\u6837 \u4e30\u5bcc\u591a\u6837 \u4e30\u5bcc\u591a\u6837 \u4ec5\u9650 OpenAI \u4e30\u5bcc\u591a\u6837 RAG\u5f15\u64ce \u2705 \u2705 \u2705 \u2705 \u2705 Agent \u2705 \u2705 \u274c \u2705 \u2705 \u5de5\u4f5c\u6d41 \u2705 \u274c \u2705 \u274c \u2705 \u53ef\u89c2\u6d4b\u6027 \u2705 \u2705 \u274c \u274c \u2705 \u4f01\u4e1a\u529f\u80fd\uff08SSO/\u8bbf\u95ee\u63a7\u5236\uff09 \u2705 \u274c \u274c \u274c \u2705 \u672c\u5730\u90e8\u7f72 \u2705 \u2705 \u2705 \u274c \u2705

"},{"location":"faq/Offline_install_OllamaModel/","title":"\u5982\u4f55\u4f7f\u7528 Ollama \u79bb\u7ebf\u90e8\u7f72 LLM \u5927\u8bed\u8a00\u6a21\u578b","text":"

\u4ee5 qwen:0.5b \u6a21\u578b\u4e3a\u4f8b\uff0c\u8be6\u7ec6\u8bf4\u660e Ollama \u79bb\u7ebf\u90e8\u7f72 LLM \u5927\u8bed\u8a00\u6a21\u578b\u7684\u8fc7\u7a0b\u548c\u6b65\u9aa4\u3002

"},{"location":"faq/Offline_install_OllamaModel/#1","title":"1 \u4e0b\u8f7d\u6a21\u578b","text":"

\u8bbf\u95ee huggingface \u5e76\u4e0b\u8f7d qwen1_5-0_5b-chat-q5_k_m.gguf \u6a21\u578b\u6587\u4ef6\u3002

https://huggingface.co/Qwen/Qwen1.5-0.5B-Chat-GGUF/tree/main\n

"},{"location":"faq/Offline_install_OllamaModel/#2","title":"2 \u4e0a\u4f20\u6a21\u578b","text":"

\u5c06\u4e0b\u8f7d\u597d\u7684 Qwen1.5-0.5B-Chat-GGUF \u6a21\u578b\u6587\u4ef6\u4e0a\u4f20\u5230 Ollama \u6240\u5728\u670d\u52a1\u5668\u3002

"},{"location":"faq/Offline_install_OllamaModel/#3-ollama-modelfile","title":"3 \u521b\u5efaOllama Modelfile","text":"

\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a Modelfile \u7684\u6587\u4ef6\uff0c\u5185\u5bb9\u5982\u4e0b\uff1a

FROM ./qwen1_5-0_5b-chat-q5_k_m.gguf\n\nTEMPLATE \"\"\"{{ if .System }}<|im_start|>system\n{{ .System }}<|im_end|>{{ end }}<|im_start|>user\n{{ .Prompt }}<|im_end|>\n<|im_start|>assistant\n\"\"\"\n\nPARAMETER stop \"<|im_start|>\"\nPARAMETER stop \"<|im_end|>\"\n
\u8bf4\u660e\uff1a\u4e0d\u540c\u6a21\u578b\u7684 Modelfile \u5185\u5bb9\u4e0d\u540c\uff0c\u53ef\u53c2\u8003 Ollama \u5b98\u7f51 \u53c2\u6570\u8bbe\u7f6e \u3002

"},{"location":"faq/Offline_install_OllamaModel/#4-ollama","title":"4 \u5728 Ollama \u4e2d\u521b\u5efa\u6a21\u578b","text":"

\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff0c\u521b\u5efa\u6a21\u578b\uff1a

ollama create qwen:0.5b -f Modelfile\n
\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff0c\u786e\u8ba4\u6a21\u578b\u521b\u5efa\u6210\u529f\uff1a
ollama list\n

"},{"location":"faq/Offline_install_OllamaModel/#5-maxkb","title":"5 \u5728 MaxKB \u4e2d\u6dfb\u52a0\u5df2\u521b\u5efa\u7684\u79c1\u6709\u6a21\u578b","text":""},{"location":"faq/apply_setting/","title":"\u5e94\u7528\u76f8\u5173\u95ee\u9898","text":""},{"location":"faq/apply_setting/#1","title":"1 \u5e94\u7528\u9ad8\u7ea7\u7f16\u6392\u8bbe\u7f6e\u9875\u9762\u753b\u5e03\u663e\u793a\u95ee\u9898","text":"

\u6d4f\u89c8\u5668\u5185\u6838\u7248\u672c\u8fc7\u4f4e\uff08\u5982\u8c37\u6b4c\u6d4f\u89c8\u5668 93.0.4577.63\uff09\uff0c\u9700\u8981\u8fdb\u884c\u6d4f\u89c8\u5668\u5347\u7ea7\u3002 \u6ce8\u610f\uff1a\u5de5\u4f5c\u6d41\u7f16\u6392\u4e0d\u652f\u6301 Safari \u6d4f\u89c8\u5668\uff0c\u5efa\u8bae\u4f7f\u7528\u6700\u65b0\u7248\u672c\u7684\u8c37\u6b4c\u7684\u6d4f\u89c8\u5668\u3002

"},{"location":"faq/apply_setting/#2","title":"2 \u4f7f\u7528\u6362\u4e2a\u7b54\u6848\u540e\u68c0\u7d22\u4e0d\u5230\u77e5\u8bc6\u5e93","text":"

\u5f53\u4f7f\u7528\u3010\u6362\u4e2a\u7b54\u6848\u3011\u529f\u80fd\u65f6\uff0c\u68c0\u7d22\u673a\u5236\u4f1a\u6392\u9664\u4e0a\u4e00\u6b21\u68c0\u7d22\u5230\u7684\u6240\u6709\u5206\u6bb5\uff0c\u7136\u540e\u91cd\u65b0\u8fdb\u884c\u68c0\u7d22\u3002\u5982\u679c\u4e0a\u4e00\u6b21\u68c0\u7d22\u7ed3\u679c\u4e2d\u53ea\u6709\u4e00\u4e2a\u5339\u914d\u9879\uff0c\u90a3\u4e48\u91cd\u65b0\u68c0\u7d22\u65f6\u53ef\u80fd\u4f1a\u51fa\u73b0\u7ed3\u679c\u4e3a\u7a7a\u7684\u60c5\u51b5\u3002

"},{"location":"faq/apply_setting/#3","title":"3 \u540c\u4e00\u4e2a\u5e94\u7528\uff0c\u663e\u793a\u4e0d\u540c\u8bed\u8a00\u754c\u9762","text":"

\u5e94\u7528\u663e\u793a\u8bbe\u7f6e\u4e2d\u7684\u8bed\u8a00\u9009\u62e9\u672a\u7edf\u4e00\u3002 \u9700\u8981\u5728\u5e94\u7528\u663e\u793a\u8bbe\u7f6e\u4e2d\u9009\u62e9\u6240\u9700\u8bed\u8a00\u5e76\u4fdd\u5b58\u3002

"},{"location":"faq/apply_setting/#4-file-is-not-a-zip-file","title":"4 \u5e94\u7528\u6587\u6863\u5185\u5bb9\u63d0\u53d6\u62a5\u9519\u201cFile is not a zip file\u201d","text":"

\u4e0a\u4f20\u7684\u6587\u4ef6\u5b9e\u9645\u662f doc \u7c7b\u578b\u6587\u4ef6\uff0c\u800c\u975e zip \u6587\u4ef6\uff0c\u9700\u8981\u786e\u4fdd\u4e0a\u4f20\u6587\u4ef6\u683c\u5f0f\u6b63\u786e\u3002

"},{"location":"faq/apply_setting/#5-mcp-unhandled-errors-in-a-taskgroup1-sub-exception","title":"5 \u5e94\u7528\u6dfb\u52a0 MCP \u7ec4\u4ef6\u62a5\u9519\u201cunhandled errors in a TaskGroup(1 sub-exception)\u201d","text":"

MCP \u670d\u52a1\u542f\u52a8\u5931\u8d25\uff0c\u6570\u636e\u5e93\u8fde\u63a5\u5bc6\u7801\u5305\u542b\u7279\u6b8a\u5b57\u7b26 @\uff0c\u4e0e dbhub \u542f\u52a8\u547d\u4ee4\u51b2\u7a81\u3002

"},{"location":"faq/apply_setting/#6-mcp-transport","title":"6 \u5e94\u7528\u6dfb\u52a0 MCP \u7ec4\u4ef6\u62a5\u9519\u201ctransport\u201d","text":"

MCP Server Config \u914d\u7f6e\u683c\u5f0f\u4e0d\u6b63\u786e\uff0c\u7f3a\u5c11 \"transport\": \"sse\" \uff0c \u9700\u5728\u914d\u7f6e\u4e2d\u6dfb\u52a0 \"transport\": \"sse\"\u3002

"},{"location":"faq/apply_setting/#7-swagger-api-url-scheme-must-be-http-or-https-for-cors-request","title":"7 \u8bf7\u6c42 Swagger API \u62a5\u9519\u201cURL scheme must be 'http' or 'https' for CORS request.\u201d","text":"

Swagger \u6587\u6863\u7684 schemes \u683c\u5f0f\u672a\u6b63\u786e\u9009\u62e9\uff0cIP \u5730\u5740\u4f7f\u7528\u4e86 http\uff0c\u800c\u57df\u540d\u4f7f\u7528\u4e86 https\u3002 \u786e\u4fdd IP \u548c\u57df\u540d\u7684\u534f\u8bae\u9700\u5339\u914d\u3002

"},{"location":"faq/apply_setting/#8","title":"8 \u5e94\u7528\u5bf9\u8bdd\u8fc7\u7a0b\u4e2d\u4e0a\u4f20\u7684\u6587\u4ef6\u5982\u4f55\u8fdb\u884c\u5b58\u50a8\uff1f\u662f\u5426\u4f1a\u5b9a\u65f6\u5220\u9664\uff1f","text":"

MaxKB \u5e94\u7528\u5728\u5bf9\u8bdd\u8fc7\u7a0b\u4e2d\u4e0a\u4f20\u7684\u6587\u4ef6\uff0c\u5148\u4e34\u65f6\u5b58\u50a8\u5728\u6570\u636e\u5e93\u4e2d\uff0c\u7136\u540e\u901a\u8fc7\u6e05\u9664\u804a\u5929\u8bb0\u5f55\u7684\u65b9\u5f0f\uff0c\u6bcf\u5929\u5b9a\u65f6\uff0800:05:00\uff09\u8fdb\u884c\u6e05\u9664\uff0c\u4ee5\u4fdd\u969c\u6570\u636e\u7684\u5b89\u5168\u6027\u3002

"},{"location":"faq/doc_segment/","title":"\u77e5\u8bc6\u5e93\u6587\u6863\u5982\u4f55\u5408\u7406\u5206\u6bb5","text":"

\u6839\u636e\u6587\u6863\u7ed3\u6784\uff0c\u5982\u4f55\u628a\u5185\u5bb9\u8fdb\u884c\u5408\u7406\u5206\u6bb5\u5bf9\u4e8e\u540e\u7eed\u7684\u77e5\u8bc6\u5e93\u68c0\u7d22\u5339\u914d\u5341\u5206\u91cd\u8981\uff0c\u6309\u7167\u6807\u9898\u8fdb\u884c\u5207\u5206\u662f\u6700\u5e38\u89c1\u7684\u65b9\u5f0f\u3002 MaxKB \u9ed8\u8ba4\u6309\u7167\u667a\u80fd\u5206\u6bb5\u4ee5\u53ca\u9ad8\u7ea7\u5206\u6bb5\u8fd9\u4e24\u79cd\u89c4\u5219\u4e0a\u4f20\u7684\u6587\u6863\u8fdb\u884c\u5207\u5206\uff0c\u8fd9\u4e24\u79cd\u89c4\u5219\u672c\u8d28\u90fd\u662f\u6839\u636e\u5206\u6bb5\u6807\u8bc6\u4ee5\u53ca\u5b57\u7b26\u6570\u8fdb\u884c\u622a\u53d6\uff0c\u5bf9\u4e8e\u6837\u5f0f\u89c4\u8303(\u6307\u7684\u662f\u4f7f\u7528\u4e86\u591a\u7ea7\u6807\u9898\u7684\u6837\u5f0f)\u7684\u6587\u6863\uff0c\u53ef\u4ee5\u83b7\u5f97\u9884\u671f\u7684\u6548\u679c\u3002

\u90a3\u4e48\u5bf9\u4e8e\u770b\u8d77\u6765\u6709\u89c4\u5f8b\u4f46\u53c8\u6ca1\u6709\u91c7\u7528\u89c4\u8303\u7684\u6807\u9898\u6837\u5f0f\u7684\u6587\u6863\uff0c\u5982\u4e0b\u56fe\u5c55\u793a\u7684\u6587\u6863\uff0c\u5e94\u8be5\u5982\u4f55\u8fdb\u884c\u5408\u7406\u5730\u5206\u6bb5\uff1f

MaxKB \u9ed8\u8ba4\u7684\u5207\u5206\u89c4\u5219\uff0c\u672c\u8d28\u4e0a\u662f\u6309\u7167\u7279\u5b9a\u7684\u6b63\u5219\u8868\u8fbe\u5f0f\u8fdb\u884c\u5207\u5206\uff0c\u9664\u6b64\u4e4b\u5916\u5728\u9ad8\u7ea7\u5206\u6bb5\u89c4\u5219\u4e2d\u8fd8\u652f\u6301\u624b\u52a8\u8f93\u5165\u6b63\u5219\u8868\u8fbe\u5f0f\u8fdb\u884c\u5207\u5206\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u6839\u636e\u6587\u6863\u89c4\u5f8b\u7684\u8868\u8fbe\u65b9\u5f0f\u8fdb\u884c\u5408\u7406\u5730\u5206\u6bb5\u3002

"},{"location":"faq/doc_segment/#1","title":"1 \u5e38\u89c1\u5206\u6bb5\u6807\u8bc6\u53ca\u5176\u6b63\u5219\u8868\u8fbe","text":"\u573a\u666f \u6837\u4f8b \u8868\u8fbe\u5f0f \u7ae0\u6807\u9898 \u7b2c\u4e00\u7ae0 RAG\u4e0e\u5927\u6a21\u578b\u5e94\u7528 [\u7b2c][\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341]+[\u7ae0] \u8282\u6807\u9898 \u7b2c\u4e00\u8282 \u5927\u6a21\u578b\u5e94\u7528\u7684\u65b9\u5411\uff1aRAG [\u7b2c][\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341]+[\u8282] \u6570\u5b57\u6807\u9898 \u4e00\u3001 RAG\u4e0e\u5927\u6a21\u578b\u5e94\u7528 1.1 \u5927\u6a21\u578b\u5e94\u7528\u7684\u65b9\u5411\uff1aRAG [\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341|1-9]+[\u3001|.][1-9]*[.]*[1-9]* \u6761\u76ee \u7b2c\u4e00\u6761\uff1a\u672c\u516c\u53f8\u5458\u5de5\u5747\u5e94\u9075\u5b88\u4ee5\u4e0b\u89c4\u5b9a\u3002 [\u7b2c][\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341]+[\u6761]"},{"location":"faq/doc_segment/#2","title":"2 \u64cd\u4f5c\u53ca\u6548\u679c","text":"

\u5c06\u4e0a\u4f20\u6587\u6863\u540e\uff0c\u5982\u679c\u9009\u62e9\u9ed8\u8ba4\u7684\u5206\u6bb5\u89c4\u5219\uff0c\u5206\u6bb5\u9884\u89c8\u6548\u679c\u4e0d\u4f73\uff0c\u53ef\u4ee5\u4f7f\u7528\u9ad8\u7ea7\u5206\u6bb5\u3002

\u4e3a\u4e86\u6709\u6548\u5206\u6bb5\uff0c\u9700\u8981\u5728\u5206\u6bb5\u6807\u8bc6\u624b\u52a8\u8f93\u5165\u5206\u6bb5\u6807\u8bc6\u7684\u6b63\u5219\u8868\u8fbe\u5f0f [\u7b2c][\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341]+[\u6761]\uff08\u6ce8\u610f\uff1a\u8f93\u5165\u540e\u9700\u8981\u56de\u8f66\u624d\u751f\u6548\uff09\uff0c\u957f\u5ea6\u8bbe\u7f6e\u4e3a\u5355\u4e2a\u6bb5\u843d\u7684\u6700\u5927\u957f\u5ea6\uff0c\u7136\u540e\u70b9\u51fb\u751f\u6210\u9884\u89c8\u3002 \u4ece\u9884\u89c8\u7ed3\u679c\u53ef\u4ee5\u770b\u5230\uff0c\u6bcf\u4e00\u6761\u90fd\u5b8c\u6574\u5730\u5207\u5206\u4e3a\u4e00\u4e2a\u6bb5\u843d\uff0c\u4fdd\u8bc1\u4e86\u8bed\u4e49\u7684\u5b8c\u6574\u6027\u3002

"},{"location":"faq/function_library/","title":"\u51fd\u6570\u5e93","text":""},{"location":"faq/function_library/#1","title":"1 \u51fd\u6570\u5e93\u8fd0\u884c\u540e\u63d0\u793a\u7f3a\u5c11\u4f9d\u8d56","text":"

\u51fd\u6570\u5e93\u8fd0\u884c\u65f6\u63d0\u793a\u7f3a\u5c11\u4f9d\u8d56\uff0c\u662f\u56e0\u4e3a\u67d0\u4e9b\u51fd\u6570\u5e93\u5728\u8fd0\u884c\u65f6\u9700\u8981\u8c03\u7528\u5176\u4ed6\u7b2c\u4e09\u65b9\u5e93\u6765\u5b8c\u6210\u7279\u5b9a\u529f\u80fd\u3002\u5982\u679c\u8fd9\u4e9b\u7b2c\u4e09\u65b9\u5e93\u672a\u5b89\u88c5\uff0c\u51fd\u6570\u5e93\u5c31\u65e0\u6cd5\u6b63\u5e38\u8fd0\u884c\uff0c\u4ece\u800c\u63d0\u793a\u7f3a\u5c11\u4f9d\u8d56\u3002 \u8fdb\u5165 MaxKB \u5bb9\u5668 \uff1a

docker exec -it maxkb bash \n
\u4f7f\u7528 pip \u5b89\u88c5\u7b2c\u4e09\u65b9\u4f9d\u8d56\uff0c\u5982 pymysql \uff1a
pip install pymysql\n

"},{"location":"faq/function_library/#2-sql-server","title":"2 \u51fd\u6570\u5e93\u8fde\u63a5 SQL Server \u6570\u636e\u5e93\u62a5\u9519","text":"

\u8fde\u63a5 SQL Server \u6570\u636e\u5e93\u65f6\uff0c\u62a5\u9519\u63d0\u793a\uff1a pymssql \u8fde\u63a5\u5931\u8d25 20002, b'DB-Lib error message 20002, severity 9: Adaptive Server connection failed\u3002 \u53ef\u80fd\u539f\u56e0\uff1a

  • \u7f51\u7edc\u95ee\u9898\uff1a\u5bb9\u5668\u65e0\u6cd5\u8bbf\u95ee\u76ee\u6807\u670d\u52a1\u5668 IP\uff08\u5982 192.168.0.23\uff09\u3002
  • \u4f9d\u8d56\u95ee\u9898\uff1apymssql \u7248\u672c\u4e0d\u517c\u5bb9\u6216\u5b89\u88c5\u5931\u8d25\u3002
  • \u8fde\u63a5\u914d\u7f6e\u95ee\u9898\uff1a\u672a\u6307\u5b9a\u6b63\u786e\u7684 TDS \u7248\u672c\u3002

\u89e3\u51b3\u65b9\u6cd5:

  • \u786e\u4fdd\u7f51\u7edc\u8fde\u901a:\u68c0\u67e5\u5bb9\u5668\u4e0e\u76ee\u6807\u670d\u52a1\u5668\u4e4b\u95f4\u7684\u7f51\u7edc\u8fde\u63a5\u662f\u5426\u6b63\u5e38\uff0c\u4ee5\u53ca SQL Server \u7684\u914d\u7f6e\uff0c\u786e\u4fdd\u5176\u5141\u8bb8\u8fdc\u7a0b\u8fde\u63a5\uff0c\u5e76\u68c0\u67e5\u9632\u706b\u5899\u8bbe\u7f6e\u662f\u5426\u5141\u8bb8\u8bbf\u95ee\u76ee\u6807\u7aef\u53e3\u3002
  • \u91cd\u65b0\u5b89\u88c5\u517c\u5bb9\u7248\u672c\u7684 pymssql\u3002\u5728\u5bb9\u5668\u4e2d\u5b89\u88c5\u4f9d\u8d56\u5e93\u540e\uff0c\u786e\u4fdd\u540e\u7eed\u5728\u51fd\u6570\u5e93\u4e2d\u6b63\u786e\u4f7f\u7528\u8fd9\u4e9b\u4f9d\u8d56\u5e93\u8fde\u63a5\u6570\u636e\u5e93\u3002
  • \u6307\u5b9a TDS \u7248\u672c\uff1a\u5728\u8fde\u63a5\u8bed\u53e5\u4e2d\u660e\u786e\u6307\u5b9a TDS \u7248\u672c\uff08\u5982 7.0\uff09\u3002
"},{"location":"faq/function_library/#3-exceptionkeyword-eval-is-banned-in-the-tool","title":"3 \u6267\u884c\u63d0\u793a \"Exception:keyword 'eval(' is banned in the tool.\"","text":"

\u4e3a\u4e86\u52a0\u5f3a\u7684\u5b89\u5168\u6027\uff0c\u9632\u6b62\u6076\u610f\u6267\u884c\u811a\u6b65\uff0cMaxKB V2 \u7248\u672c\u5728\u5de5\u5177\u7684\u811a\u672c\u4e2d\u7981\u6b62\u4e86 subprocess\u3001system\u3001eval \u7b49\u8bed\u53e5\u3002

"},{"location":"faq/install_configuration/","title":"\u5b89\u88c5\u90e8\u7f72\u4ee5\u53ca\u542f\u52a8\u95ee\u9898","text":""},{"location":"faq/install_configuration/#1-maxkb-docker-compose-xxxx","title":"1 \u5b89\u88c5 MaxKB \u8fc7\u7a0b\u62a5\u9519 docker-compose--X.XX.X \u65e0\u6cd5\u542f\u52a8\u6216\u8005\u8bbf\u95ee\u670d\u52a1","text":"

Docker \u7248\u672c\u592a\u8001\u53ef\u80fd\u4f1a\u5bfc\u81f4\u5b89\u88c5\u5931\u8d25\uff0c\u5efa\u8bae\u73af\u5883\u5efa\u8bae\u4f7f\u7528\u5b89\u88c5\u5305\u5185\u7684 Docker\u3002\u5b89\u88c5\u5305\u6240\u4f7f\u7528\u7684 Docker \u7248\u672c\u4e3a 27.2.0\u3001Compose \u7248\u672c\u4e3a v2.29.2\u3002

"},{"location":"faq/install_configuration/#2-pgsql","title":"2 \u5982\u4f55\u5c06\u5185\u7f6e\u7684 pgsql \u901a\u8fc7\u6307\u5b9a\u7684\u4e3b\u673a\u7aef\u53e3\u63d0\u4f9b\u5bf9\u5916\u8bbf\u95ee\uff1f","text":"

\u9ed8\u8ba4\u914d\u7f6e\u8fdb\u884c\u5b89\u88c5\u65f6\uff0c\u4e3a\u4e86\u5b89\u5168\u6027\uff0cpgsql \u5bb9\u5668\u53ea\u5bf9\u5bbf\u4e3b\u673a\u63d0\u4f9b 5432 \u7684\u8bbf\u95ee\u7aef\u53e3\uff0c\u5176\u5b83\u5730\u5740\u90fd\u65e0\u6cd5\u8bbf\u95ee\u3002

\u5982\u679c\u9700\u8981\u5c06 pgsql \u66b4\u9732\u7ed9\u5176\u5b83\u670d\u52a1\u5668\u8bbf\u95ee\uff0c\u53ef\u5728 /opt/maxkb/.env \u4e2d\u914d\u7f6e\uff0c\u7136\u540e\u6267\u884cmkctl reload\uff0c\u91cd\u65b0\u52a0\u8f7d\u914d\u7f6e\u5373\u53ef\u3002

"},{"location":"faq/install_configuration/#3-modulenotfounderror-no-module-named-xxx","title":"3 \u5347\u7ea7\u8fc7\u7a0b\u63d0\u793a ModuleNotFoundError: No module named 'XXX'","text":"

\u67d0\u4e9b\u65e7\u7248\u672c\u7684\u4f9d\u8d56\u5305\u4e0e\u65b0\u7248\u672c\u4e0d\u517c\u5bb9\uff0c\u5bfc\u81f4\u7cfb\u7edf\u65e0\u6cd5\u6b63\u5e38\u8fd0\u884c\u3002\u8fdb\u5165\u4f9d\u8d56\u5305\u7684\u5b58\u50a8\u76ee\u5f55\uff1a \u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff0c\u521b\u5efa\u6a21\u578b\uff1a

cd /opt/maxkb/python-packages\n
\u627e\u5230\u5bfc\u81f4\u4f9d\u8d56\u51b2\u7a81\u7684\u5305\uff0c\u901a\u5e38\u901a\u8fc7\u67e5\u770b\u9519\u8bef\u65e5\u5fd7\u6765\u786e\u5b9a\u5177\u4f53\u51b2\u7a81\u7684\u5305\u540d\u3002\u5b8c\u6210\u4f9d\u8d56\u5305\u7684\u6e05\u7406\u540e\uff0c\u91cd\u542f\u670d\u52a1 mkctl restart \u4ee5\u786e\u4fdd\u66f4\u6539\u751f\u6548\u3002

"},{"location":"faq/install_configuration/#4-postgresql-too-many-clients-already","title":"4 PostgreSQL \u8d85\u8fc7\u6700\u5927\u5ba2\u6237\u7aef\u8fde\u63a5\u6570\uff0c\u63d0\u793a too many clients already \u7684\u9519\u8bef","text":"

\u8fd9\u8868\u660e\u5f53\u524d\u914d\u7f6e\u7684\u5ba2\u6237\u7aef\u8fde\u63a5\u6570\u5df2\u8fbe\u5230\u4e0a\u9650\uff0c\u9700\u8981\u8c03\u6574\u914d\u7f6e\u4ee5\u5141\u8bb8\u66f4\u591a\u7684\u8fde\u63a5\u3002\u8fdb\u5165 PostgreSQL \u914d\u7f6e\u6587\u4ef6\u6240\u5728\u7684\u76ee\u5f55\uff1a

cd /opt/maxkb/data/postgresql/pgdata/\n
\u5728 postgresql.conf \u6587\u4ef6\u4e2d\u627e\u5230 max_connections \u53c2\u6570\uff0c\u5c06\u5176\u503c\u8bbe\u7f6e\u4e3a\u6240\u9700\u7684\u8fde\u63a5\u6570\u3002\u4f8b\u5982\uff0c\u5c06\u6700\u5927\u8fde\u63a5\u6570\u8bbe\u7f6e\u4e3a 200
max_connections = 200\n
\u505c\u6b62\u5f53\u524d\u8fd0\u884c\u7684 MaxKB \u670d\u52a1\uff0c\u5220\u9664 PostgreSQL \u5bb9\u5668\uff1a
docker stop maxkb\n\ndocker rm maxkb\n
\u6267\u884c mkctl reload \u91cd\u65b0\u52a0\u8f7d\u670d\u52a1\u914d\u7f6e\u5e76\u542f\u52a8\u670d\u52a1\u3002

"},{"location":"faq/install_configuration/#5","title":"5 \u8fc1\u79fb\u5e38\u89c1\u95ee\u9898","text":""},{"location":"faq/install_configuration/#51-powershell","title":"5.1 \u65e0\u6cd5\u6267\u884c PowerShell \u811a\u672c","text":"

\u5982\u679c\u65e0\u6cd5\u6267\u884c PowerShell \u811a\u672c\uff0c\u53ef\u80fd\u9700\u8981\u4fee\u6539\u6267\u884c\u7b56\u7565\uff1a

  • \u4e34\u65f6\u4fee\u6539\uff08\u63a8\u8350\uff09
    Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process       \n
  • \u6c38\u4e45\u4fee\u6539\uff08\u9700\u7ba1\u7406\u5458\u6743\u9650\uff09
    Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine     \n
"},{"location":"faq/install_configuration/#52","title":"5.2 \u6267\u884c\u811a\u672c\u540e\u51fa\u73b0\u4e71\u7801\u62a5\u9519","text":"

\u7528\u8bb0\u4e8b\u672c\u6253\u5f00\u6587\u4ef6\uff0c\u5c06\u6587\u4ef6\u53e6\u5b58\u4e3a ANSI \u683c\u5f0f\u7684\u6587\u672c\u3002

\u91cd\u65b0\u6267\u884c PowerShell \u5373\u53ef\u6b63\u5e38\u6267\u884c\u8fc1\u79fb\u547d\u4ee4\u3002

"},{"location":"faq/install_configuration/#53-docker-desktop-maxkb-maxkb","title":"5.3 Docker Desktop \u5b89\u88c5\u7684 MaxKB \u8fc1\u79fb\u540e\u76ee\u5f55\u8def\u5f84\u5185\u5bb9\u4e3a\u7a7a\uff0c\u4f46 MaxKB \u80fd\u6b63\u5e38\u8fd0\u884c","text":"

Docker Desktop \u5b89\u88c5\u7684 MaxKB \u8fc1\u79fb\u540e\u6302\u8f7d\u8def\u5f84\u5185\u5bb9\u4e3a\u7a7a\uff0c\u4f46 MaxKB \u80fd\u6b63\u5e38\u8fd0\u884c\u3002

\u5b89\u88c5 MaxKB V2 \u65f6\uff0c\u5bb9\u5668\u6570\u636e\u7684\u6302\u8f7d\u76ee\u5f55\u4e3a /opt/maxkb\uff0c\u4fee\u6539\u6302\u8f7d\u76ee\u5f55\u5373\u53ef\u3002

V1:/var/lib/postgresql/data\nV2:/opt/maxkb\n

"},{"location":"faq/knowledge_base/","title":"\u77e5\u8bc6\u5e93","text":""},{"location":"faq/knowledge_base/#1","title":"1 \u667a\u80fd\u5206\u6bb5\u6548\u679c\u4e0d\u7406\u60f3","text":"

\u9ed8\u8ba4\u7684\u5206\u6bb5\u903b\u8f91\u65e0\u6cd5\u5b8c\u5168\u9002\u914d\u7279\u5b9a\u6587\u6863\u7684\u5185\u5bb9\u7ed3\u6784\uff0c\u53ef\u4ee5\u5c1d\u8bd5\u5728\u5bfc\u5165\u6587\u6863\u540e\u9009\u62e9\u201c\u9ad8\u7ea7\u5206\u6bb5\u201d\uff0c\u5e76\u5728\u5206\u6bb5\u6807\u8bc6\u8f93\u5165\u6846\u4e2d\u76f4\u63a5\u8f93\u5165\u6b63\u5219\u8868\u8fbe\u5f0f\uff0c\u4ee5\u5b9e\u73b0\u7cbe\u51c6\u7684\u5206\u6bb5\u64cd\u4f5c\u3002

\u5e94\u7528\u573a\u666f\u4e3e\u4f8b\uff1a

  • \u591a\u7ea7\u6570\u5b57\u7f16\u53f7 \u6b63\u5219\u8868\u8fbe\u5f0f\uff1a\\d+.\\d*.\\d*.[a-zA-Z\\s]*[\\u4e00-\\u9fa5\uff0c]+ \u793a\u4f8b\uff1a1. \u4e00\u7ea7\u6807\u9898 1.1 \u4e8c\u7ea7\u6807\u9898

  • \u4e2d\u6587\u5e8f\u53f7\u7f16\u53f7\uff1a \u6b63\u5219\u8868\u8fbe\u5f0f\uff1a[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341]*\u3001[\\u4e00-\\u9fa5a-zA-Z]+ \u793a\u4f8b\uff1a\u4e00\u3001\u6807\u9898

  • \u5c0f\u8bf4\u7ae0\u8282\u76ee\u5f55\uff1a \u6b63\u5219\u8868\u8fbe\u5f0f\uff1a[\u7b2c][\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341]+[\u7ae0][\\u4e00-\\u4e00a-zA-Z]+ \u793a\u4f8b\uff1a\u7b2c\u4e00\u7ae0 \u6807\u9898

  • \u591a\u7ea7\u4e2d\u6587+\u6570\u5b57\u7f16\u53f7\uff1a \u6b63\u5219\u8868\u8fbe\u5f0f\uff1a[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341|1-9]+[\u3001|.]1-9*.[1-9]*[\\u4e00-\\u9fa5a-zA-Z]+ \u793a\u4f8b\uff1a\u4e00\u3001\u4e00\u7ea7\u6807\u9898 1.1 \u4e8c\u7ea7\u6807\u9898

\u8be6\u7ec6\u64cd\u4f5c\u548c\u9884\u89c8\u6548\u679c\u53ef\u53c2\u8003 MaxKB \u4f7f\u7528\u6b63\u5219\u8868\u8fbe\u5f0f\u5206\u6bb5\u3002

"},{"location":"faq/knowledge_base/#2-0","title":"2 \u4e0a\u4f20\u6587\u6863\u5411\u91cf\u5316\u540e\uff0c\u5b57\u7b26\u6570\u4e3a 0","text":"

\u4e0a\u4f20\u7684\u6587\u6863\u7c7b\u578b\u5b9e\u9645\u662f .doc \u683c\u5f0f\uff0c\u800c\u975e\u5176\u4ed6\u652f\u6301\u7684\u683c\u5f0f\uff0c\u5bfc\u81f4\u5411\u91cf\u5316\u540e\u5b57\u7b26\u6570\u4e3a 0\u3002 \u4e0a\u4f20\u6587\u6863\u8981\u6c42\uff1a

  • \u6587\u672c\u6587\u4ef6\uff1aMarkdown\u3001TXT\u3001PDF\u3001DOCX\u3001HTML\u3001XLS\u3001XLSX\u3001CSV\u3001ZIP\uff1b
  • \u8868\u683c\uff1aXLS\u3001XLSX\u3001CSV\u3001ZIP;
  • QA \u95ee\u7b54\u5bf9\uff1aXLS\u3001XLSX\u3001CSV\u3001ZIP\uff1b
"},{"location":"faq/knowledge_base/#3","title":"3 \u6587\u6863\u63d0\u4ea4\u6210\u529f\uff0c\u4f46\u672a\u663e\u793a\u4e0a\u4f20\u7684\u6587\u6863","text":"

F12\u67e5\u770b\u62a5\u9519\u4ee3\u7801\uff0c\u5982\u679c\u663e\u793a \u201c413 Request Entity Too Large\u201d\uff0c\u5219\u662f nginx \u7b49\u53cd\u5411\u4ee3\u7406\u7684\u8bf7\u6c42\u5927\u5c0f\u914d\u7f6e\u592a\u5c0f\uff0c\u5982\u679c\u662f nginx\uff0c\u5219\u4fee\u6539 client_max_body_size \u503c\uff0c\u7136\u540e\u91cd\u65b0\u52a0\u8f7d nginx \u914d\u7f6e\u5373\u53ef\u3002

"},{"location":"faq/knowledge_base/#4-zip","title":"4 \u77e5\u8bc6\u5e93\u4ee5 ZIP \u683c\u5f0f\u5bfc\u51fa\u518d\u5bfc\u5165\u65f6\u5206\u6bb5\u6570\u4e0d\u4e00\u81f4","text":"

\u5bfc\u51fa\u77e5\u8bc6\u5e93\u540e\uff0c\u91cd\u65b0\u4e0a\u4f20 ZIP \u6587\u4ef6\u65f6\uff0c\u8bf7\u9009\u62e9 \u201cQA \u95ee\u7b54\u5bf9\u201d \u8fdb\u884c\u5bfc\u5165\u3002

"},{"location":"faq/knowledge_base/#5","title":"5 \u77e5\u8bc6\u5e93\u4e0a\u4f20\u6587\u6863\u540e\uff0c\u6587\u6863\u6807\u9898\u4e71\u7801","text":"

\u538b\u7f29\u8f6f\u4ef6\u5bfc\u81f4\u95ee\u9898\u3002\u5df2\u77e5 WinRAR \u548c 52 \u538b\u7f29\u5b58\u5728\u517c\u5bb9\u6027\u95ee\u9898\uff0c\u5efa\u8bae\u4f7f\u7528\u5176\u4ed6\u538b\u7f29\u8f6f\u4ef6\u8fdb\u884c\u538b\u7f29\u548c\u89e3\u538b\u64cd\u4f5c\u3002

"},{"location":"faq/knowledge_base/#6","title":"6 \u5411\u91cf\u5316\u6210\u529f\uff0c\u4f46\u751f\u6210\u95ee\u9898\u5931\u8d25","text":"

\u53ef\u80fd\u662f\u5f53\u524d\u4f7f\u7528\u7684\u751f\u6210\u95ee\u9898\u7684\u5927\u6a21\u578b\u5b58\u5728\u95ee\u9898\u3002\u53ef\u4ee5\u5c1d\u8bd5\u66f4\u6362\u5176\u4ed6\u751f\u6210\u95ee\u9898\u7684\u5927\u6a21\u578b\u6765\u89e3\u51b3\u6b64\u95ee\u9898\u3002\u6b64\u5916\uff0c\u53ef\u4ee5\u68c0\u67e5\u540e\u53f0\u65e5\u5fd7\u6587\u4ef6\u4ee5\u83b7\u53d6\u66f4\u591a\u9519\u8bef\u4fe1\u606f\uff0c\u65e5\u5fd7\u6587\u4ef6\u4f4d\u4e8e /opt/maxkb/logs \u76ee\u5f55\u4e0b\uff0c\u901a\u8fc7\u67e5\u770b\u65e5\u5fd7\u53ef\u4ee5\u4e86\u89e3\u5177\u4f53\u7684\u9519\u8bef\u539f\u56e0\u3002

"},{"location":"faq/maxkb_In_halo/","title":"\u5c06 MaxKB \u5c0f\u52a9\u624b\u96c6\u6210\u5230 Halo \u4e2d","text":"

Halo [\u02c8he\u026alo\u028a]\uff0c\u5f3a\u5927\u6613\u7528\u7684\u5f00\u6e90\u5efa\u7ad9\u5de5\u5177\u3002\u901a\u8fc7 MaxKB \u5c0f\u52a9\u624b\u63d2\u4ef6\uff0c\u53ef\u4ee5\u5c06\u6587\u7ae0\u5185\u5bb9\u540c\u6b65\u81f3 MaxKB \u77e5\u8bc6\u5e93\uff0c\u5e76\u53ef\u901a\u8fc7\u6d6e\u7a97\u6a21\u5f0f\u4e3a\u7f51\u7ad9\u63d0\u4f9b\u667a\u80fd\u95ee\u7b54\u3002 \u6709\u5173 MaxKB \u5c0f\u52a9\u624b\u63d2\u4ef6\u7684\u4f7f\u7528\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b \u5b98\u65b9\u6587\u6863\u3002

"},{"location":"faq/system_management/","title":"\u7cfb\u7edf\u7ba1\u7406","text":""},{"location":"faq/system_management/#1","title":"1 \u7528\u6237\u7ba1\u7406","text":""},{"location":"faq/system_management/#11","title":"1.1 \u5fd8\u8bb0\u4e86\u767b\u5f55\u5bc6\u7801\u5982\u4f55\u5904\u7406","text":"

\u975e admin \u7528\u6237\u5fd8\u8bb0\u5bc6\u7801\uff1a

  • \u5df2\u8bbe\u7f6e\u90ae\u7bb1\u7ed1\u5b9a\uff1a\u5982\u679c\u7528\u6237\u5df2\u8bbe\u7f6e\u90ae\u7bb1\u5e76\u5b8c\u6210\u7ed1\u5b9a\uff0c\u53ef\u5728\u4e2a\u4eba\u4fe1\u606f\u9875\u9762\u901a\u8fc7\u3010\u4fee\u6539\u5bc6\u7801\u3011\u529f\u80fd\u8fdb\u884c\u5bc6\u7801\u4fee\u6539\u4e0e\u627e\u56de\u3002
  • \u672a\u8bbe\u7f6e\u90ae\u7bb1\u7ed1\u5b9a\uff1a\u82e5\u7528\u6237\u672a\u8bbe\u7f6e\u90ae\u7bb1\u7ed1\u5b9a\uff0c\u53ef\u7531 admin \u7ba1\u7406\u4eba\u5458\u767b\u5f55\u7cfb\u7edf\uff0c\u5728\u3010\u7528\u6237\u7ba1\u7406\u3011\u9875\u9762\u4e2d\uff0c\u627e\u5230\u5bf9\u5e94\u7528\u6237\u5e76\u76f4\u63a5\u4fee\u6539\u5176\u5bc6\u7801\uff0c\u4ece\u800c\u5e2e\u52a9\u7528\u6237\u627e\u56de\u5bc6\u7801\u3002

admin \u7528\u6237\u5fd8\u8bb0\u5bc6\u7801\uff1a \u5982\u679c\u5df2\u914d\u7f6e\u90ae\u7bb1\u8bbe\u7f6e\uff0c\u53ef\u5728\u767b\u5f55\u9875\u9762\u70b9\u51fb\u3010\u5fd8\u8bb0\u5bc6\u7801\u3011\u8fdb\u884c\u5bc6\u7801\u627e\u56de\u3002\u82e5\u672a\u914d\u7f6e\u90ae\u7bb1\uff0c\u5219\u9700\u901a\u8fc7\u4fee\u6539\u6570\u636e\u5e93\u5c06\u5bc6\u7801\u6062\u590d\u4e3a\u9ed8\u8ba4\u5bc6\u7801\u3002\u64cd\u4f5c\u6b65\u9aa4\u5982\u4e0b\uff1a \u5728\u7ebf\u5b89\u88c5\u8fdb\u5165 MaxKB \u5bb9\u5668\uff08\u82e5\u662f\u79bb\u7ebf\u5b89\u88c5\u5305\uff0c\u8bf7\u8fdb\u5165 pgsql \u5bb9\u5668\uff09

docker exec -it maxkb bash\n

\u767b\u5f55 PgSQL

psql -Uroot\n
\u8fdb\u5165 MaxKB \u6570\u636e\u5e93
\\c maxkb;\n
\u8fde\u63a5\u5230\u6570\u636e\u5e93\u540e\uff0c\u6267\u884c\u4e0b\u9762\u7684 SQL \u8bed\u53e5\u53ef\u4ee5\u5c06\u7528\u6237 admin \u7684\u5bc6\u7801\u91cd\u7f6e\u4e3a MaxKB@123..
update  \"public\".\"user\" set password='d880e722c47a34d8e9fce789fc62389d' where username='admin';\n

\u6ce8\u610f\uff1a\u627e\u56de admin \u5bc6\u7801\u540e\u4f18\u5148\u914d\u7f6e\u90ae\u7bb1\uff0c\u4ee5\u4fbf\u4e0b\u6b21\u5fd8\u8bb0\u5bc6\u7801\u65f6\u80fd\u76f4\u63a5\u4f7f\u7528\u3010\u5fd8\u8bb0\u5bc6\u7801\u3011\u529f\u80fd\u8fdb\u884c\u627e\u56de\u3002

"},{"location":"faq/system_management/#12","title":"1.2 \u7f16\u8f91\u7528\u6237\u65f6\u6ca1\u6709\u6743\u9650\u8bbf\u95ee","text":"

\u7f51\u5173\u914d\u7f6e\u4e2d\u672a\u5bf9 PUT \u65b9\u6cd5\u8fdb\u884c\u653e\u884c\uff0c\u4ece\u800c\u5bfc\u81f4\u6743\u9650\u9a8c\u8bc1\u5931\u8d25\u3002

"},{"location":"faq/system_management/#2","title":"2 \u6a21\u578b\u5bf9\u63a5","text":""},{"location":"faq/system_management/#21-ollama-api","title":"2.1 \u5bf9\u63a5 Ollama \u65f6\u63d0\u793a API \u57df\u540d\u65e0\u6548","text":"

API \u57df\u540d\u5185\u5bb9\u8bf4\u660e\uff1a

  • API \u57df\u540d\u683c\u5f0f\uff1ahttp://ollama \u6240\u5728\u670d\u52a1\u7684ip\u5730\u5740:ollama \u7684\u7aef\u53e3\u53f7 / \u3002

\u6ce8\u610f\uff1aAPI \u57df\u540d\u4e0d\u53ef\u4f7f\u7528 127.0.0.1 \u6216 localhost\u3002

\u83b7\u53d6 Ollama \u670d\u52a1\u7684 IP \u5730\u5740\uff1a \u5728 Ollama \u6240\u5728\u670d\u52a1\u5668\u4e0a\u6267\u884c: ip addr , \u83b7\u53d6\u5230\u670d\u52a1\u5668\u7684 IP \u5730\u5740\u3002 \u67e5\u8be2 Ollama \u670d\u52a1\u5668 IP \u5730\u5740\u4e3a 172.26.186.35\uff0c\u5219 API \u57df\u540d\u4e3a\uff1ahttp://172.26.186.53:11434

\u786e\u4fdd\u670d\u52a1\u53ef\u8bbf\u95ee\uff1a MaxKB \u5bb9\u5668\u9700\u8981\u53ef\u6b63\u5e38\u8bbf\u95ee Ollama \u670d\u52a1\u3002\u5728 MaxKB \u5bb9\u5668\u4e2d\u8bbf\u95ee Ollama \u7684 API \u57df\u540d\uff0c\u786e\u4fdd\u8fd4\u56de \u3010Ollama is running\u3011\u7684\u72b6\u6001\u3002

Ollama \u914d\u7f6e\u6587\u4ef6\u4fee\u6539\uff1a \u4fee\u6539 /etc/systemd/system/ollama \u6587\u4ef6\uff0c\u914d\u7f6e\u76d1\u542c\u5728 0.0.0.0 \u7f51\u6bb5 \u589e\u52a0 Environment=\u201cOLLAMA_HOST=0.0.0.0\u201d \u3002

\u4ee5\u4e0a\u786e\u8ba4\u65e0\u8bef\u540e\uff0c\u518d\u5230 MaxKB \u4e2d \u6dfb\u52a0 Ollama \u7684\u6a21\u578b\u3002 \u5bf9\u4e8e Window \u73af\u5883\u5b89\u88c5 Ollama \u53ef\u8fdb\u4e00\u6b65\u53c2\u8003\uff1aWindows \u7cfb\u7edf\u672c\u5730\u90e8\u7f72 Ollama + MaxKB \u5b89\u88c5\u6559\u7a0b\u3002

"},{"location":"faq/system_management/#22","title":"2.2 \u5bf9\u63a5\u56fe\u7247\u751f\u6210\u6a21\u578b\u65f6\u9a8c\u8bc1\u5931\u8d25","text":"

\u539f\u56e0\u662f\u53c2\u6570\u7ec4\u4ef6\u7c7b\u578b\u9519\u8bef\u3002\u5177\u4f53\u8868\u73b0\u4e3a\u201cguidance_scale\u201d\u7ec4\u4ef6\u7c7b\u578b\u8bbe\u7f6e\u9519\u8bef\u3002\u89e3\u51b3\u65b9\u6cd5\u662f\u5c06\u201cguidance_scale\u201d\u7ec4\u4ef6\u7c7b\u578b\u66f4\u6539\u4e3a\u6ed1\u5757\uff0c\u5e76\u5c06\u6b65\u957f\u8bbe\u7f6e\u4e3a 1\u3002

"},{"location":"faq/system_management/#23-xinference","title":"2.3 \u5bf9\u63a5 XInference \u8bed\u97f3\u5408\u6210\u6a21\u578b\u9a8c\u8bc1\u5931\u8d25","text":"

\u9519\u8bef\u4fe1\u606f\u5982\u4e0b\uff1a Error code: 400 - {'detail': '[address=0.0.0.0:4215, pid=41292] Model not found, uid: XXX'} \u3002 \u539f\u56e0\u53ef\u80fd\u662f\u6a21\u578b\u540d\u79f0\u6216\u7248\u672c\u4e0d\u6b63\u786e\u3002 \u89e3\u51b3\u6b65\u9aa4\uff1a

  • \u68c0\u67e5\u6a21\u578b\u540d\u79f0\uff1a\u5728\u5bb9\u5668\u4e2d\u901a\u8fc7 curl \u8bf7\u6c42\u67e5\u770b\u662f\u5426\u6709\u5bf9\u5e94\u7684\u6a21\u578b\u540d\u79f0\u8fd4\u56de
  • \u68c0\u67e5 XInference \u7248\u672c\u3002\u5982\u679c\u4f7f\u7528\u7684\u7248\u672c\u4e3a v1.3.0.post2 \uff0c\u8be5\u7248\u672c\u4e3a\u6d4b\u8bd5\u7248\u672c\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u7684\u60c5\u51b5\u3002\u5efa\u8bae\u5207\u6362\u5230\u66f4\u7a33\u5b9a\u7684\u7248\u672c\uff0c\u4f8b\u5982 XInference \u7684\u6700\u65b0\u7a33\u5b9a\u7248\u672c\u3002
"},{"location":"faq/system_management/#24-connection-error","title":"2.4 \u6dfb\u52a0\u6a21\u578b\u5931\u8d25\u63d0\u793a Connection error","text":"

\u901a\u5e38\u662f\u7531\u7f51\u7edc\u8fde\u63a5\u95ee\u9898\u5f15\u8d77\u7684\u3002\u6392\u67e5\u601d\u8def\uff1a

  • \u68c0\u67e5\u9632\u706b\u5899\u8bbe\u7f6e\uff1a\u786e\u8ba4\u9632\u706b\u5899\u662f\u5426\u9650\u5236\u4e86\u76f8\u5173\u7aef\u53e3\u3002\u5982\u679c\u9650\u5236\u4e86\uff0c\u8bf7\u5f00\u653e\u8be5\u7aef\u53e3\uff0c\u786e\u4fdd\u5bb9\u5668\u53ef\u4ee5\u6b63\u5e38\u8bbf\u95ee\u7f51\u7edc\u3002

  • \u68c0\u67e5\u5bb9\u5668\u7f51\u7edc\u914d\u7f6e\uff1a\u786e\u8ba4\u5bb9\u5668\u5185\u662f\u5426\u6709\u7f51\u7edc\u8fde\u63a5\u3002\u53ef\u4ee5\u5c1d\u8bd5\u5728\u5bb9\u5668\u5185\u6267\u884c\u7f51\u7edc\u6d4b\u8bd5\u547d\u4ee4\uff08\u5982 ping \u6216 curl\uff09\u6765\u68c0\u67e5\u7f51\u7edc\u8fde\u901a\u6027\u3002

"},{"location":"faq/system_management/#25-balance","title":"2.5 \u6dfb\u52a0\u6a21\u578b\u5931\u8d25\u63d0\u793a balance \u76f8\u5173\u5185\u5bb9","text":"

\u5728\u5bf9\u5e94\u7684\u5e73\u53f0\u4e0a\u68c0\u67e5\u6a21\u578b\u53ef\u7528\u6027\uff0c\u786e\u4fdd\u6a21\u578b\u6709\u4f59\u989d\u53ef\u8c03\u7528\u3002

"},{"location":"faq/system_management/#26-str-object-has-no-attribute-model_dump-invalid-api-key-provided","title":"2.6 \u6dfb\u52a0\u6a21\u578b\u5931\u8d25\u63d0\u793a 'str' object has no attribute 'model_dump' \u6216\u8005 Invalid API-key provided","text":"

\u6838\u5b9eAPI\u57df\u540d\u548c\u5bc6\u94a5\uff1a\u786e\u4fdd API \u57df\u540d\u662f\u53ef\u7528\u4e14\u914d\u7f6e\u6b63\u786e\u7684\uff0c\u5e76\u4e14\u5bf9\u5e94\u7684 API Key \u662f\u6709\u6548\u7684\u3001\u5177\u6709\u8db3\u591f\u6743\u9650\u7684\u3002\u5982\u679c\u662f\u7b2c\u4e09\u65b9\u4ee3\u7406\u670d\u52a1\uff0c\u53ef\u80fd\u9700\u8981\u8054\u7cfb\u5176\u63d0\u4f9b\u65b9\u786e\u8ba4\u670d\u52a1\u72b6\u6001\u548c\u914d\u7f6e\u8981\u6c42\u3002

"},{"location":"installation/1panel_installtion/","title":"1Panel \u5b89\u88c5","text":""},{"location":"installation/1panel_installtion/#1-1panel","title":"1 \u5b89\u88c5 1Panel","text":"

\u5173\u4e8e 1Panel \u7684\u5b89\u88c5\u90e8\u7f72\u4e0e\u57fa\u7840\u529f\u80fd\u4ecb\u7ecd\uff0c\u8bf7\u53c2\u8003 1Panel \u5b98\u65b9\u6587\u6863 \u3002\u5728\u5b8c\u6210\u4e86 1Panel \u7684\u5b89\u88c5\u90e8\u7f72\u540e\uff0c\u6839\u636e\u63d0\u793a\u7f51\u5740\u6253\u5f00\u6d4f\u89c8\u5668\u8fdb\u5165 1Panel\uff0c\u754c\u9762\u5982\u4e0b\u3002

"},{"location":"installation/1panel_installtion/#2-maxkb","title":"2 \u5b89\u88c5 MaxKB","text":"

\u8fdb\u5165\u5e94\u7528\u5546\u5e97\u5e94\u7528\u5217\u8868\uff0c\u5728\u3010AI/\u5927\u6a21\u578b\u3011\u5206\u7c7b\u4e0b\u627e\u5230 MaxKB \u5e94\u7528\u8fdb\u884c\u5b89\u88c5\u3002

\u5728\u5b89\u88c5\u9875\u9762\u914d\u7f6e MaxKB \u5e94\u7528\u53c2\u6570\uff1a

  • \u540d\u79f0\uff1a\u8981\u521b\u5efa\u7684 MaxKB \u5e94\u7528\u7684\u540d\u79f0\u3002
  • \u7248\u672c\uff1a\u9009\u62e9 MaxKB \u7684\u7248\u672c\u3002
  • \u7aef\u53e3\uff1aMaxKB \u5e94\u7528\u7684\u670d\u52a1\u7aef\u53e3\u3002
  • \u5bb9\u5668\u540d\u79f0\uff1aMaxKB \u5e94\u7528\u5bb9\u5668\u540d\u79f0\u3002
  • CPU \u9650\u5236\uff1aMaxKB \u5e94\u7528\u53ef\u4ee5\u4f7f\u7528\u7684 CPU \u6838\u5fc3\u6570\u3002
  • \u5185\u5b58\u9650\u5236\uff1aMaxKB \u5e94\u7528\u53ef\u4ee5\u4f7f\u7528\u7684\u5185\u5b58\u5927\u5c0f\u3002
  • \u7aef\u53e3\u5916\u90e8\u8bbf\u95ee\uff1aMaxKB \u5e94\u7528\u53ef\u4ee5\u4f7f\u7528 IP:PORT \u8fdb\u884c\u8bbf\u95ee\uff08MaxKB \u5e94\u7528\u5fc5\u987b\u52fe\u9009\u5916\u90e8\u7aef\u53e3\u8bbf\u95ee\uff09\u3002

\u70b9\u51fb\u786e\u8ba4\u5f00\u59cb\u5b89\u88c5\uff0c\u9875\u9762\u81ea\u5c06\u52a8\u8df3\u8f6c\u5230\u5df2\u5b89\u88c5\u5e94\u7528\u5217\u8868\uff0c\u7b49\u5f85 MaxKB \u5e94\u7528\u72b6\u6001\u53d8\u4e3a\u5df2\u542f\u52a8\u3002

"},{"location":"installation/1panel_installtion/#3-maxkb","title":"3 \u8bbf\u95ee MaxKB","text":"

\u5b89\u88c5\u6210\u529f\u540e\uff0c\u901a\u8fc7\u6d4f\u89c8\u5668\u8bbf\u95ee\u5982\u4e0b\u9875\u9762\u767b\u5f55 MaxKB\uff1a

\u5730\u5740: http://\u76ee\u6807\u670d\u52a1\u5668IP\u5730\u5740:\u670d\u52a1\u8fd0\u884c\u7aef\u53e3\uff08\u9ed8\u8ba4 8080\uff09     \n\u7528\u6237\u540d: admin    \n\u5bc6\u7801: MaxKB@123..\n

\u4e3a\u4e86\u5b89\u5168\uff0cadmin \u7b2c\u4e00\u6b21\u767b\u5f55\u65f6\u5c06\u8981\u6c42\u4fee\u6539\u9ed8\u8ba4\u5bc6\u7801\uff0c\u4fee\u6539\u5bc6\u7801\u540e\uff0c\u91cd\u65b0\u767b\u5f55\u7cfb\u7edf\u5373\u53ef\u4f7f\u7528 MaxKB\u3002

"},{"location":"installation/aliyun/","title":"\u4e91\u5e02\u573a\u90e8\u7f72\u6307\u5357","text":"

\u672c\u6307\u5357\u5c06\u4ecb\u7ecd\u5982\u4f55\u901a\u8fc7\u963f\u91cc\u4e91\u4e91\u5e02\u573a\u8d2d\u4e70\u3001\u90e8\u7f72\u548c\u4f7f\u7528 MaxKB \u955c\u50cf\uff0c\u5e76\u63d0\u4f9b\u8d2d\u4e70\u670d\u52a1\u5668\u7684\u4f18\u60e0\u94fe\u63a5\u3002

"},{"location":"installation/aliyun/#1","title":"1 \u8d2d\u4e70\u955c\u50cf","text":"
  • MaxKB \u5df2\u7ecf\u4e0a\u67b6\u5230\u963f\u91cc\u4e91\u4e91\u5e02\u573a\uff0c\u60a8\u53ef\u4ee5\u901a\u8fc7\u4ee5\u4e0b\u94fe\u63a5\u76f4\u63a5\u8d2d\u4e70\u955c\u50cf\uff1a MaxKB \u4e91\u5e02\u573a\u8d2d\u4e70\u94fe\u63a5

  • \u60a8\u4e5f\u53ef\u4ee5\u81ea\u884c\u8d2d\u4e70\u963f\u91cc\u4e91\u670d\u52a1\u5668\uff0c\u5e76\u5728\u9009\u62e9\u955c\u50cf\u65f6\u641c\u7d22 MaxKB\uff0c\u5373\u53ef\u5feb\u901f\u9009\u62e9\u955c\u50cf\u8fdb\u884c\u90e8\u7f72\u3002

\u6ce8\u610f\uff1a \u8d2d\u4e70\u65f6\u8bf7\u9009\u62e9\u5408\u9002\u7684\u5b9e\u4f8b\u89c4\u683c\uff0c\u5efa\u8bae 4C/8G \u53ca\u4ee5\u4e0a\u3002

\u670d\u52a1\u5668\u4f18\u60e0

\u5982\u679c\u60a8\u8fd8\u6ca1\u6709\u670d\u52a1\u5668\uff0c\u53ef\u4ee5\u901a\u8fc7\u4ee5\u4e0b\u4f18\u60e0\u94fe\u63a5\u8d2d\u4e70\u963f\u91cc\u4e91\u670d\u52a1\u5668\uff1a

  • \u4e13\u5c5e\u963f\u91cc\u4e91\u7279\u4ef7\u94fe\u63a5 5.5 \u6298\u4f18\u60e0
"},{"location":"installation/aliyun/#2","title":"2 \u542f\u52a8\u670d\u52a1","text":"

\u955c\u50cf\u542f\u52a8\u540e\uff0c\u60a8\u53ef\u4ee5\u901a\u8fc7\u6d4f\u89c8\u5668\u8bbf\u95ee\u4ee5\u4e0b\u5730\u5740\u767b\u5f55 MaxKB\uff1a

\u670d\u52a1\u8bbf\u95ee\u5730\u5740: http://\u670d\u52a1\u5668IP:8080\n\u9ed8\u8ba4\u7528\u6237\u540d: admin\n\u9ed8\u8ba4\u5bc6\u7801: MaxKB@123..\n

\u9996\u6b21\u767b\u5f55\u540e\uff0c\u5efa\u8bae\u53ca\u65f6\u66f4\u6539\u5bc6\u7801\u5e76\u8fdb\u884c\u5176\u4ed6\u5b89\u5168\u8bbe\u7f6e\u3002

"},{"location":"installation/aliyun/#3","title":"3 \u5f00\u653e\u7aef\u53e3","text":"
  • \u4e3a\u4e86\u786e\u4fdd\u5916\u90e8\u80fd\u591f\u6b63\u5e38\u8bbf\u95ee MaxKB \u670d\u52a1\uff0c\u60a8\u9700\u8981\u5728\u963f\u91cc\u4e91\u670d\u52a1\u5668\u7684\u5b89\u5168\u7ec4\u89c4\u5219\u4e2d\u5f00\u653e 8080 \u7aef\u53e3\u3002

  • \u5177\u4f53\u7684\u5f00\u653e\u6b65\u9aa4\u53ef\u4ee5\u53c2\u8003\u963f\u91cc\u4e91\u7684 \u7aef\u53e3\u653e\u884c\u6559\u7a0b\u3002

"},{"location":"installation/backup/","title":"\u5907\u4efd\u4e0e\u8fd8\u539f","text":"

MaxKB \u5b89\u88c5\u540e\uff0c\u76f8\u5173\u6587\u4ef6\u7684\u5206\u5e03\u8def\u5f84\u5982\u4e0b\uff1a

  • /opt/maxkb\uff1a\u9ed8\u8ba4\u8fd0\u884c\u8def\u5f84\uff0c\u5728\u5b89\u88c5\u65f6\u53ef\u8bbe\u7f6e\u3002\u4e3b\u8981\u5b58\u653e MaxKB \u8fd0\u884c\u65f6\u6240\u9700\u7684\u914d\u7f6e\u6587\u4ef6\u53ca\u8fd0\u884c\u65f6\u4ea7\u751f\u7684\u6570\u636e\uff0c\u5305\u62ec\u65e5\u5fd7\u6587\u4ef6\u7b49
  • /usr/bin\uff1a\u9ed8\u8ba4 docker \u53ca docker-compose \u7684\u8fd0\u884c\u7a0b\u5e8f\u88ab\u653e\u7f6e\u5728\u6b64\u76ee\u5f55\u4e0b
  • /usr/local/bin/mkctl\uff1aMaxKB \u7684\u547d\u4ee4\u884c\u5de5\u5177
  • /var/lib/docker\uff1a\u9ed8\u8ba4 docker \u955c\u50cf\u52a0\u8f7d\u5728\u6b64

\u7efc\u4e0a\u6240\u8ff0\uff0c\u5907\u4efd MaxKB \u4e3b\u8981\u9700\u8981\u5907\u4efd\u8fd0\u884c\u8def\u5f84\uff0c\u5982 /opt/maxkb \u76ee\u5f55\u5373\u53ef\u3002\u8fd8\u539f\u6b65\u9aa4\u5982\u4e0b\uff1a

  • \u8be5\u65b9\u5f0f\u9002\u7528\u4e8e\u76f8\u540c\u7248\u672c MaxKB \u7684\u8fc1\u79fb\uff0c\u8bf7\u5728\u65b0\u73af\u5883\u91cc\u5b89\u88c5\u540c\u4e00\u4e2a\u7248\u672c\u7684 MaxKB\uff0c\u5b89\u88c5\u65f6\u8bf7\u9009\u62e9\u76f8\u540c\u7684\u914d\u7f6e\u53c2\u6570
  • \u505c\u6b62 MaxKB \u670d\u52a1\uff0c\u6267\u884c\u547d\u4ee4\uff1a mkctl stop
  • \u628a\u539f\u73af\u5883\u91cc\u7684\u8fd0\u884c\u76ee\u5f55 /opt/maxkb \u6574\u4e2a\u76ee\u5f55\u8986\u76d6\u6389\u65b0\u73af\u5883\u91cc\u7684 /opt/maxkb \u76ee\u5f55
  • \u542f\u52a8\u65b0\u73af\u5883\u91cc\u7684 MaxKB \u670d\u52a1\uff1a mkctl restart
"},{"location":"installation/cli/","title":"\u547d\u4ee4\u884c\u5de5\u5177","text":""},{"location":"installation/cli/#1-mkctl","title":"1 mkctl \u547d\u4ee4","text":"

MaxKB \u79bb\u7ebf\u5b89\u88c5\u5305\u9ed8\u8ba4\u5185\u7f6e\u4e86\u547d\u4ee4\u884c\u8fd0\u7ef4\u5de5\u5177 mkctl\uff0c\u901a\u8fc7\u6267\u884c mkctl help\uff0c\u53ef\u4ee5\u67e5\u770b\u76f8\u5173\u7684\u547d\u4ee4\u8bf4\u660e\u3002

\u8bf4\u660e\uff1a\u901a\u8fc7\u5728\u7ebf\u5b89\u88c5\u30011Panel\u65b9\u5f0f\u8fdb\u884c\u5b89\u88c5\u65f6\uff0c\u6ca1\u6709\u5185\u7f6e mkctl \u547d\u4ee4\u3002

Usage:\nmkctl [COMMAND] [ARGS...]\nmkctl --help\n\nCommands: \nstatus              \u67e5\u770b MaxKB \u670d\u52a1\u8fd0\u884c\u72b6\u6001\nstart               \u542f\u52a8 MaxKB \u670d\u52a1\nstop                \u505c\u6b62 MaxKB \u670d\u52a1\nrestart             \u91cd\u542f MaxKB \u670d\u52a1\nreload              \u91cd\u65b0\u52a0\u8f7d MaxKB \u670d\u52a1\nuninstall           \u5378\u8f7d MaxKB \u670d\u52a1\uff08\u4e0d\u4f1a\u5220\u9664\u6570\u636e\uff09\nversion             \u67e5\u770b MaxKB \u7248\u672c\u4fe1\u606f\nclean-images        \u6e05\u7406 MaxKB \u65e7\u7248\u672c\u7684\u76f8\u5173\u955c\u50cf\n
"},{"location":"installation/migrate/","title":"\u8fc1\u79fb\u5de5\u5177","text":""},{"location":"installation/migrate/#1","title":"1 \u8fc1\u79fb\u8bf4\u660e","text":""},{"location":"installation/migrate/#11","title":"1.1 \u8fc1\u79fb\u8def\u7ebf","text":"

\u6ce8\u610f\uff1av1 \u7248\u672c\u9700\u5148\u5347\u7ea7\u81f3 v1.10.10-lts \u7248\u672c\u53ca\u540e\u7eed\u7248\u672c\uff0c\u518d\u4f7f\u7528\u8fc1\u79fb\u5de5\u5177\u8fc1\u79fb\u5230 v2.1.0\u3002\u8fc1\u79fb\u7684 v2 \u7248\u672c\u4e3a v2.1.0 \uff0c\u4e4b\u540e\u53ef\u5347\u7ea7\u5230 v2 \u66f4\u9ad8\u7248\u672c\u3002

"},{"location":"installation/migrate/#12","title":"1.2 \u6ce8\u610f\u4e8b\u9879","text":"
  • \u6b64\u5de5\u5177\u662f\u8fc1\u79fb\u5de5\u5177\uff0c\u7528\u4ee5\u5c06 v1 1.10.10-lts \u53ca\u540e\u7eed\u7248\u672c\u7684\u6570\u636e\u8fc1\u79fb\u5230 v2.1.0\uff0c\u5e76\u4e0d\u662f\u76f4\u63a5\u7684\u5347\u7ea7\u5de5\u5177\uff1b
  • \u6b64\u5de5\u5177\u53ea\u652f\u6301 v1 1.10.10-lts \u53ca\u540e\u7eed\u7248\u672c\u7684\u6570\u636e\u8fc1\u79fb\u5230 v2.1.0\uff1b
  • \u6570\u636e\u8fc1\u79fb\u7684\u76ee\u6807\u73af\u5883\u5fc5\u987b\u662f v2.1.0\uff0c\u4e14\u6ca1\u6709\u4efb\u4f55\u6570\u636e\uff08license \u9664\u5916\uff09\uff1b
  • \u8fc1\u79fb\u524d\uff0c\u8bf7\u505c\u6b62\u5728 v1 \u73af\u5883\u7684\u4efb\u4f55\u64cd\u4f5c\uff0c\u907f\u514d\u6570\u636e\u8fc1\u79fb\u4e0d\u5b8c\u6574\uff1b
  • \u8fc1\u79fb\u524d\uff0c\u8bf7\u52a1\u5fc5\u68c0\u67e5\u78c1\u76d8\u7a7a\u95f4\uff0c\u5e76\u786e\u4fdd\u6570\u636e\u5bfc\u51fa\u548c\u5bfc\u5165\u524d\u540e\u6709\u8db3\u591f\u7684\u5b58\u50a8\u7a7a\u95f4\uff1b
  • \u8fc1\u79fb\u65f6\uff0c\u4fdd\u8bc1 v1 \u548c v2 \u7684\u5bb9\u5668\u90fd\u5904\u4e8e\u6b63\u5e38\u8fd0\u884c\u72b6\u6001\uff08\u4e0d\u9700\u8981\u505c\u6b62\u670d\u52a1\uff09\u3002
"},{"location":"installation/migrate/#2","title":"2 \u8fc1\u79fb\u5de5\u5177\u4e0b\u8f7d","text":"

\u6253\u5f00 MaxKB \u8fc1\u79fb\u5de5\u5177\u4e0b\u8f7d\u9875\u9762\uff0c\u4e0b\u8f7d\u6700\u65b0\u7248\u672c\u5de5\u5177\uff0c\u5e76\u4e0a\u4f20\u81f3\u90e8\u7f72\u670d\u52a1\u5668\u3002

"},{"location":"installation/migrate/#3","title":"3 \u8fc1\u79fb\u64cd\u4f5c","text":""},{"location":"installation/migrate/#31-linuxmacos","title":"3.1 Linux/macOS \u7cfb\u7edf","text":""},{"location":"installation/migrate/#311","title":"3.1.1 \u5bfc\u51fa\u6570\u636e","text":"

\u5728 v1.10.10-lts \u53ca\u540e\u7eed\u7248\u672c\u7684\u673a\u5668\u4e0a\u4e0b\u8f7d MaxKB-v1-to-v2-migrator-<version>.zip\uff0c\u89e3\u538b\u540e\u8fdb\u5165\u76ee\u5f55\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\u5bfc\u51fa v1 \u6570\u636e\u3002

  • \u5982\u679c v1 \u7684\u6570\u636e\u91cf\u8f83\u5927\uff0c\u5bfc\u51fa\u8fc7\u7a0b\u4e2d\u9700\u8981\u4e00\u5b9a\u7684\u65f6\u95f4\uff0c\u8bf7\u52a1\u5fc5\u8010\u5fc3\u7b49\u5f85\u3002
  • \u5bfc\u51fa\u5b8c\u6210\u540e\uff0cMaxKB-v1-to-v2-migrator-<version> \u4e2d\u4f1a\u751f\u6210\u4e00\u4e2a migrate.zip\u3002
unzip MaxKB-v1-to-v2-migrator-<version>.zip \n\ncd  MaxKB-v1-to-v2-migrator-<version>\n\nbash export_v1_data.sh <v1_container_name>\n

\u5c06 MaxKB-v1-to-v2-migrator-<version> \u590d\u5236\u5230 v2.1.0 \u6240\u5728\u7684\u673a\u5668\u4e0a\u3002

"},{"location":"installation/migrate/#312","title":"3.1.2 \u5bfc\u5165\u6570\u636e","text":"

\u5728 v2.1.0 \u673a\u5668\u4e0a\uff0c\u786e\u4fdd v2.1.0 \u7248\u672c\u7684\u5bb9\u5668\u5df2\u7ecf\u542f\u52a8\u4e14\u6ca1\u6709\u4efb\u4f55\u5176\u5b83\u6570\u636e\uff0c\u4e13\u4e1a\u7248\u9700\u63d0\u524d\u5bfc\u5165 license\u3002

\u8fdb\u5165\u8fc1\u79fb\u5de5\u5177\u76ee\u5f55\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\u5c06\u6570\u636e\u5bfc\u5165 v2.1.0\u3002

cd MaxKB-v1-to-v2-migrator-<version>\n\nbash import_v2_data.sh <v2_container_name>\n
\u6ce8\u610f\uff1av1 \u793e\u533a\u7248\u53ea\u80fd\u8fc1\u79fb\u5230 v2 \u793e\u533a\u7248\uff0cv1 \u4e13\u4e1a\u7248\u53ea\u80fd\u8fc1\u79fb\u5230 v2 \u4e13\u4e1a\u7248\uff0c\u4e14 v1 \u548c v2 \u7684\u4e13\u4e1a\u7248\u5fc5\u987b\u6709\u6709\u6548\u7684 license \u8bb8\u53ef\u3002

\u5bfc\u5165\u6210\u529f\u540e\uff0c\u9700\u8981\u91cd\u542f MaxKB \u670d\u52a1\u3002

"},{"location":"installation/migrate/#32-windows","title":"3.2 Windows \u7cfb\u7edf","text":""},{"location":"installation/migrate/#321","title":"3.2.1 \u64cd\u4f5c\u8981\u6c42","text":"

\u652f\u6301\u7684\u64cd\u4f5c\u7cfb\u7edf\uff1a

  • Windows 10
  • Windows 11
  • Windows Server 2016 \u53ca\u4ee5\u4e0a\u7248\u672c

\u524d\u7f6e\u6761\u4ef6\uff1a

  • \u5df2\u5b89\u88c5 Docker Desktop for Windows\uff1b
  • MaxKB v1 \u548c v2 \u5bb9\u5668\u6b63\u5728\u8fd0\u884c\uff1b
  • \u5bf9\u4e8e PowerShell \u811a\u672c\uff0c\u9700\u8981 PowerShell 5.0 \u6216\u66f4\u9ad8\u7248\u672c\u3002
"},{"location":"installation/migrate/#322","title":"3.2.2 \u5bfc\u51fa\u6570\u636e","text":"

\u5bf9\u4e8e Windows \u7cfb\u7edf\uff0cMaxKB \u63d0\u4f9b\u4e86 PowerShell \u811a\u672c\uff08.ps1\uff09\u6765\u5bfc\u51fa v1 1.10.10-lts \u53ca\u540e\u7eed\u7248\u672c\u7684\u6570\u636e\u3002\u4e0b\u8f7d\u8fc1\u79fb\u5de5\u5177\u5e76\u89e3\u538b\uff0c\u4f7f\u7528\u7ec8\u7aef\u7ba1\u7406\u5458\u8fdb\u5165\u8fc1\u79fb\u76ee\u5f55\uff0c\u6267\u884c\u547d\u4ee4\u5bfc\u51fa v1 \u6570\u636e\u3002

  • \u5982\u679c v1 \u7684\u6570\u636e\u91cf\u8f83\u5927\uff0c\u5bfc\u51fa\u8fc7\u7a0b\u4e2d\u9700\u8981\u4e00\u5b9a\u7684\u65f6\u95f4\uff0c\u8bf7\u52a1\u5fc5\u8010\u5fc3\u7b49\u5f85\u3002
  • \u5bfc\u51fa\u5b8c\u6210\u540e\uff0cMaxKB-v1-to-v2-migrator-<version> \u4e2d\u4f1a\u751f\u6210\u4e00\u4e2a migrate.zip\u3002
    # PowerShell \u811a\u672c\n.\\export_v1_data.ps1 -ContainerName <v1_container_name>\n

"},{"location":"installation/migrate/#323","title":"3.2.3 \u5bfc\u5165\u6570\u636e","text":"

\u5728 v2.1.0 \u673a\u5668\u4e0a\uff0c\u786e\u4fdd v2.1.0 \u7248\u672c\u7684\u5bb9\u5668\u5df2\u7ecf\u542f\u52a8\u4e14\u6ca1\u6709\u4efb\u4f55\u5176\u5b83\u6570\u636e\uff0c\u4e13\u4e1a\u7248\u9700\u63d0\u524d\u5bfc\u5165 license\u3002

#PowerShell \u811a\u672c\n.\\import_v2_data.ps1 -ContainerName <v2_container_name>\n

\u6ce8\u610f\uff1av1 \u793e\u533a\u7248\u53ea\u80fd\u8fc1\u79fb\u5230 v2 \u793e\u533a\u7248\uff0cv1 \u4e13\u4e1a\u7248\u53ea\u80fd\u8fc1\u79fb\u5230 v2 \u4e13\u4e1a\u7248\uff0c\u4e14 v1 \u548c v2 \u7684\u4e13\u4e1a\u7248\u5fc5\u987b\u6709\u6709\u6548\u7684 license \u8bb8\u53ef\u3002

"},{"location":"installation/migrate/#4","title":"4 \u8fc1\u79fb\u53d8\u66f4\u8bf4\u660e","text":""},{"location":"installation/migrate/#41","title":"4.1 \u7528\u6237","text":"
  • \u5982\u679c v1 \u4e2d\u7528\u6237\u7684\u3010\u59d3\u540d\u3011\u4e3a\u7a7a\uff0c\u8fc1\u79fb\u540e\uff0c\u81ea\u52a8\u5c06\u3010\u7528\u6237\u540d\u3011\u4f5c\u4e3a\u3010\u59d3\u540d\u3011\uff1b
  • \u5de5\u4f5c\u7a7a\u95f4\u5185\u7684\u8d44\u6e90\u67e5\u8be2\u4f9d\u7167\u3010\u59d3\u540d\u3011\u67e5\u8be2\uff1b
  • admin \u8d26\u6237\u9ed8\u8ba4\u6388\u4e88\u7cfb\u7edf\u7ba1\u7406\u5458\u3001\u5de5\u4f5c\u7a7a\u95f4\u7ba1\u7406\u5458\u3001\u666e\u901a\u7528\u6237\u6743\u9650\uff08X-Pack\uff09\uff1b
  • \u9664 admin \u5916\uff0c\u7cfb\u7edf\u7528\u6237\u6216\u5176\u4ed6\u7528\u6237\u7c7b\u578b\u8fc1\u79fb\u540e\uff0c\u9ed8\u8ba4\u89d2\u8272\u4e3a\u666e\u901a\u7528\u6237\uff08X-Pack\uff09\u3002
"},{"location":"installation/migrate/#42","title":"4.2 \u8d44\u6e90","text":"
  • v1 \u6388\u6743\u7ed9\u5176\u4ed6\u6210\u5458\u7684\u5e94\u7528/\u77e5\u8bc6\u5e93\uff0c\u8fc1\u79fb\u540e\u6388\u4e88\u76f8\u5e94\u7684\u6743\u9650\uff1b
  • \u8d44\u6e90\u521b\u5efa\u8005\u62e5\u6709\u7ba1\u7406\u8d44\u6e90\u7684\u6743\u9650\uff1b
  • v1 \u51fd\u6570\u5e93\u8fc1\u79fb\u540e\uff0c\u5728\u5de5\u5177\u4e2d\uff0c\u521b\u5efa\u8005\u6709\u7ba1\u7406\u6743\u9650\uff0c\u5176\u4ed6\u7528\u6237\u9ed8\u8ba4\u662f\u4e0d\u6388\u6743\u72b6\u6001\uff1b
  • \u516c\u6709\u6a21\u578b\u8fc1\u79fb\u540e\uff0c\u9ed8\u8ba4\u8d44\u6e90\u6388\u6743\u6240\u6709\u666e\u901a\u7528\u6237\u4e3a\u67e5\u770b\u6743\u9650\uff0c\u521b\u5efa\u8005\u4e3a\u7ba1\u7406\u6743\u9650\u3002
"},{"location":"installation/migrate/#43","title":"4.3 \u63a5\u53e3","text":"
  • v1 \u4e0e v2 \u7684\u63a5\u53e3\u6587\u6863\u4e0d\u4e00\u81f4\uff0c\u5982\u6709\u63a5\u53e3\u8c03\u7528\uff0c\u9700\u91cd\u65b0\u914d\u7f6e\uff1b
"},{"location":"installation/migrate/#44","title":"4.4 \u5e94\u7528\u63a5\u5165","text":"
  • \u5e94\u7528\u63a5\u5165\u5230\u4f01\u4e1a\u5fae\u4fe1\u7b49\u7684\u56de\u8c03\u5730\u5740\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u5e94\u7528\u63a5\u5165\u3001\u767b\u5f55\u8ba4\u8bc1\uff08\u626b\u7801\u767b\u5f55\uff09\u9700\u91cd\u65b0\u914d\u7f6e\uff08X-Pack\uff09\uff1b
"},{"location":"installation/migrate/#45","title":"4.5 \u77e5\u8bc6\u5e93","text":"
  • \u7531\u4e8e v1 \u4e0a\u4f20\u77e5\u8bc6\u5e93\u7684\u6587\u6863\u5e76\u65e0\u4fdd\u5b58\u539f\u6587\u6863\uff0c\u8fc1\u79fb\u5230 v2 \u540e\uff0c\u5bf9\u5e94\u77e5\u8bc6\u5e93\u6587\u6863\u4e0d\u652f\u6301\u3010\u4e0b\u8f7d\u539f\u6587\u6863\u3011\u7684\u529f\u80fd\u3002
"},{"location":"installation/offline_installtion/","title":"\u79bb\u7ebf\u5b89\u88c5","text":""},{"location":"installation/offline_installtion/#1","title":"1 \u90e8\u7f72\u8981\u6c42","text":"

\u5982\u679c\u7528\u4e8e\u751f\u4ea7\u73af\u5883\uff0c\u79bb\u7ebf\u5b89\u88c5\u662f\u5b98\u65b9\u63a8\u8350\u7684\u5b89\u88c5\u65b9\u5f0f\u3002

"},{"location":"installation/offline_installtion/#11","title":"1.1 \u670d\u52a1\u5668\u914d\u7f6e","text":"

\u90e8\u7f72\u670d\u52a1\u5668\u8981\u6c42\uff1a

  • \u64cd\u4f5c\u7cfb\u7edf\uff1aUbuntu 22.04 / CentOS 7\uff08\u5185\u6838\u7248\u672c\u8981\u6c42 \u2265 3.10\uff09
  • CPU/\u5185\u5b58\uff1a4C/8GB \u4ee5\u4e0a
  • \u78c1\u76d8\u7a7a\u95f4\uff1a100GB

\u63d0\u793a\uff1aDocker \u7248\u672c\u592a\u4f4e\u53ef\u80fd\u4f1a\u5bfc\u81f4\u5b89\u88c5\u5931\u8d25\uff0c\u5efa\u8bae\u4f7f\u7528\u5b89\u88c5\u5305\u5185\u7684 Docker\uff0c\u6216\u8005\u4f7f\u7528 v26.0.0 \u7248\u672c\u53ca\u4ee5\u4e0a\u7684 Docker\u3002

"},{"location":"installation/offline_installtion/#12","title":"1.2 \u7aef\u53e3\u8981\u6c42","text":"

\u79bb\u7ebf\u90e8\u7f72 MaxKB \u9700\u8981\u5f00\u901a\u7684\u8bbf\u95ee\u7aef\u53e3\u8bf4\u660e\u5982\u4e0b\uff1a

\u7aef\u53e3 \u4f5c\u7528 \u8bf4\u660e 22 SSH \u5b89\u88c5\u3001\u5347\u7ea7\u53ca\u7ba1\u7406\u4f7f\u7528 8080 Web \u670d\u52a1\u7aef\u53e3 \u9ed8\u8ba4 Web \u670d\u52a1\u8bbf\u95ee\u7aef\u53e3\uff0c\u53ef\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u8fdb\u884c\u66f4\u6539"},{"location":"installation/offline_installtion/#2","title":"2 \u5b89\u88c5\u5305\u4e0b\u8f7d","text":"

\u6253\u5f00 \u98de\u81f4\u4e91\u5f00\u6e90\u793e\u533a MaxKB \u793e\u533a\u7248\u4e0b\u8f7d \u9875\u9762\u4e0b\u8f7d\u6700\u65b0\u7248\u672c\u5b89\u88c5\u5305\uff0c\u5e76\u4e0a\u4f20\u81f3\u90e8\u7f72\u670d\u52a1\u5668\uff08\u4ee5 v2.0.0 \u4e3a\u4f8b\u8bf4\u660e\u5b89\u88c5\u90e8\u7f72\u8fc7\u7a0b\uff09\u3002

"},{"location":"installation/offline_installtion/#3","title":"3 \u5b89\u88c5\u90e8\u7f72","text":""},{"location":"installation/offline_installtion/#31","title":"3.1 \u89e3\u538b\u5b89\u88c5\u5305","text":"

\u4ee5 root \u7528\u6237\u901a\u8fc7 ssh \u534f\u8bae\u767b\u5f55\u5230\u90e8\u7f72\u670d\u52a1\u5668, \u5bf9\u5b89\u88c5\u5305\u8fdb\u884c\u89e3\u538b\uff1a

tar -zxvf maxkb-v2.0.0-x86_64-offline-installer.tar.gz\n

"},{"location":"installation/offline_installtion/#32","title":"3.2 \u5b89\u88c5\u914d\u7f6e\uff08\u53ef\u9009\uff09","text":"

MaxKB \u5b89\u88c5\u76ee\u5f55\u3001\u670d\u52a1\u8fd0\u884c\u7aef\u53e3\u3001\u6570\u636e\u5e93\u914d\u7f6e\u7b49\u4fe1\u606f\u53ef\u5728\u5b89\u88c5\u5305\u89e3\u538b\u540e\u4e2d\u7684 install.conf \u6587\u4ef6\u8fdb\u884c\u914d\u7f6e\u3002

# \u57fa\u7840\u914d\u7f6e\n## \u5b89\u88c5\u76ee\u5f55\nMAXKB_BASE=/opt\n## \u670d\u52a1\u7aef\u53e3\nMAXKB_PORT=8080\n## docker \u7f51\u6bb5\u8bbe\u7f6e\nMAXKB_DOCKER_SUBNET=172.31.250.192/26\n\n# \u6570\u636e\u5e93\u914d\u7f6e\n## \u662f\u5426\u4f7f\u7528\u5916\u90e8\u6570\u636e\u5e93\nMAXKB_EXTERNAL_PGSQL=false\n## \u6570\u636e\u5e93\u5730\u5740\nMAXKB_PGSQL_HOST=pgsql\n## \u6570\u636e\u5e93\u7aef\u53e3\nMAXKB_PGSQL_PORT=5432\n## \u6570\u636e\u5e93\u5e93\u540d\nMAXKB_PGSQL_DB=maxkb\n## \u6570\u636e\u5e93\u7528\u6237\u540d\nMAXKB_PGSQL_USER=root\n## \u6570\u636e\u5e93\u5bc6\u7801\nMAXKB_PGSQL_PASSWORD=Password123@postgres\n\n# Redis\u914d\u7f6e\n## \u662f\u5426\u4f7f\u7528\u5916\u90e8Redis\nMAXKB_EXTERNAL_REDIS=false\n## Redis\u5730\u5740\nREDIS_HOST=redis\n## Redis\u7aef\u53e3\nREDIS_PORT=6379\n## Redis\u6570\u636e\u5e93\nREDIS_DB=0\n## Redis\u5bc6\u7801\nREDIS_PASSWORD=Password123@redis\n\n# \u955c\u50cf\u914d\u7f6e\n## \u955c\u50cf\u4ed3\u5e93\nMAXKB_IMAGE_REPOSITORY=registry.fit2cloud.com/maxkb\n## \u955c\u50cf\u540d\u79f0\nMAXKB_IMAGE=maxkb\n## \u7248\u672c\u53f7\nMAXKB_VERSION=v2.0.0\n

\u6ce8\u610f\uff1a

  • \u9996\u6b21\u5b89\u88c5\u4e4b\u524d\u53ef\u4ee5\u5728 install.conf\u6587\u4ef6\u4e2d\u7684\u4fee\u6539\u53c2\u6570\uff0c\u5b89\u88c5\u65f6\u5219\u6839\u636e\u4fee\u6539\u540e\u7684\u53c2\u6570\u6267\u884c\u5b89\u88c5\u3002\u5b89\u88c5\u540e\u5982\u9700\u518d\u6b21\u4fee\u6539\u914d\u7f6e\u53c2\u6570\uff0c\u5219\u9700\u8981\u5728 ${MAXKB_BASE}/maxkb/.env\uff08\u9ed8\u8ba4\u662f /opt/maxkb/.env\uff09\u6587\u4ef6\u4e2d\u8fdb\u884c\u4fee\u6539\uff0c\u5e76\u4e14\u5728\u4fee\u6539\u5b8c\u540e\u9700\u6267\u884c mkctl reload \u547d\u4ee4\u91cd\u65b0\u52a0\u8f7d\u914d\u7f6e\u6587\u4ef6\u3002
  • MAXKB_PGSQL_PORT\u3001REDIS_PORT \u4ec5\u9488\u5bf9\u4f7f\u7528\u5916\u90e8\u6570\u636e\u5e93\u65f6\u6709\u6548\uff0c\u5982\u679c\u662f\u4f7f\u7528\u5185\u7f6e\u7684\u6570\u636e\u5e93\uff0c\u8bf7\u4e0d\u8981\u505a\u4fee\u6539\u3002
"},{"location":"installation/offline_installtion/#33","title":"3.3 \u6267\u884c\u5b89\u88c5\u811a\u672c","text":"
# \u8fdb\u5165\u5b89\u88c5\u5305\u89e3\u538b\u7f29\u540e\u76ee\u5f55  \ncd maxkb-v2.0.0-x86_64-offline-installer\n\n# \u6267\u884c\u5b89\u88c5\u547d\u4ee4\nbash install.sh\n
"},{"location":"installation/offline_installtion/#4","title":"4 \u767b\u5f55\u8bbf\u95ee","text":"

\u5f85\u6240\u6709\u5bb9\u5668\u72b6\u6001\u663e\u793a\u4e3ahealthy\u540e\uff0c\u5373\u53ef\u901a\u8fc7\u6d4f\u89c8\u5668\u8bbf\u95ee\u5730\u5740 http://\u76ee\u6807\u670d\u52a1\u5668 IP \u5730\u5740:8080\uff0c\u5e76\u4f7f\u7528\u9ed8\u8ba4\u7684\u7ba1\u7406\u5458\u7528\u6237\u548c\u5bc6\u7801\u767b\u5f55 MaxKB\u3002

\u7528\u6237\u540d\uff1aadmin\n\u9ed8\u8ba4\u5bc6\u7801\uff1aMaxKB@123..\n

"},{"location":"installation/offline_installtion/#5","title":"5 \u79bb\u7ebf\u5347\u7ea7","text":"

\u79bb\u7ebf\u5347\u7ea7\u4e0e\u5b89\u88c5\u64cd\u4f5c\u8fc7\u7a0b\u57fa\u672c\u4e00\u6837\uff0c\u5373\u4e0b\u8f7d\u65b0\u7248\u672c\u5b89\u88c5\u5305\u4e0a\u4f20\u5e76\u89e3\u538b\u540e\uff0c\u518d\u6b21\u6267\u884c\u5b89\u88c5\u547d\u4ee4\u8fdb\u884c\u5347\u7ea7\u3002

# \u8fdb\u5165\u65b0\u7248\u672c\u76ee\u5f55\ncd maxkb-v2.x.y-offline\n\n# \u8fd0\u884c\u5b89\u88c5\u811a\u672c\nbash install.sh\n\n# \u67e5\u770b MaxKB \u8fd0\u884c\u72b6\u6001\nmkctl status\n

\u6ce8\u610f\uff1a \u5347\u7ea7\u524d\u8bf7\u5148\u5bf9\u6570\u636e\u5e93\u8fdb\u884c\u5907\u4efd\u3002

"},{"location":"installation/online_installtion/","title":"\u5728\u7ebf\u5b89\u88c5","text":""},{"location":"installation/online_installtion/#1","title":"1 \u90e8\u7f72\u8981\u6c42","text":""},{"location":"installation/online_installtion/#11","title":"1.1 \u670d\u52a1\u5668\u914d\u7f6e","text":"

\u90e8\u7f72\u670d\u52a1\u5668\u8981\u6c42\uff1a

  • \u64cd\u4f5c\u7cfb\u7edf\uff1aUbuntu 22.04 / CentOS 7\uff08\u5185\u6838\u7248\u672c\u8981\u6c42 \u2265 3.10\uff09
  • CPU/\u5185\u5b58\uff1a4C/8GB \u4ee5\u4e0a
  • \u78c1\u76d8\u7a7a\u95f4\uff1a100GB

\u63d0\u793a\uff1aDocker \u7248\u672c\u592a\u4f4e\u53ef\u80fd\u4f1a\u5bfc\u81f4\u5b89\u88c5\u5931\u8d25\uff0c\u5efa\u8bae\u4f7f\u7528\u5b89\u88c5\u5305\u5185\u7684 Docker\uff0c\u6216\u8005\u4f7f\u7528 v26.0.0 \u7248\u672c\u53ca\u4ee5\u4e0a\u7684 Docker\u3002

"},{"location":"installation/online_installtion/#12","title":"1.2 \u7aef\u53e3\u8981\u6c42","text":"

\u5728\u7ebf\u90e8\u7f72 MaxKB \u9700\u8981\u5f00\u901a\u7684\u8bbf\u95ee\u7aef\u53e3\u8bf4\u660e\u5982\u4e0b\uff1a

\u7aef\u53e3 \u4f5c\u7528 \u8bf4\u660e 22 SSH \u5b89\u88c5\u3001\u5347\u7ea7\u53ca\u7ba1\u7406\u4f7f\u7528 8080 Web \u670d\u52a1\u7aef\u53e3 \u9ed8\u8ba4 Web \u670d\u52a1\u8bbf\u95ee\u7aef\u53e3\uff0c\u53ef\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u8fdb\u884c\u66f4\u6539"},{"location":"installation/online_installtion/#2","title":"2 \u5728\u7ebf\u5feb\u901f\u90e8\u7f72","text":"

\u5728\u914d\u7f6e Docker \u73af\u5883\u7684\u64cd\u4f5c\u7cfb\u7edf\u4e2d\uff0c\u4ec5\u9700\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\u5373\u53ef\u4e00\u952e\u5b8c\u6210 MaxKB \u7684\u5b89\u88c5\uff1a

# Linux \u64cd\u4f5c\u7cfb\u7edf\ndocker run -d --name=maxkb --restart=always -p 8080:8080 -v ~/.maxkb:/opt/maxkb registry.fit2cloud.com/maxkb/maxkb\n\n# Windows \u64cd\u4f5c\u7cfb\u7edf\ndocker run -d --name=maxkb --restart=always -p 8080:8080 -v C:/maxkb:/opt/maxkb registry.fit2cloud.com/maxkb/maxkb\n

\u5f85\u6240\u6709\u5bb9\u5668\u72b6\u6001\u663e\u793a\u4e3ahealthy\u540e\uff0c\u53ef\u901a\u8fc7\u6d4f\u89c8\u5668\u8bbf\u95ee MaxKB\uff1a

http://\u76ee\u6807\u670d\u52a1\u5668 IP \u5730\u5740:8080\n\n\u9ed8\u8ba4\u767b\u5f55\u4fe1\u606f\n\u7528\u6237\u540d\uff1aadmin\n\u9ed8\u8ba4\u5bc6\u7801\uff1aMaxKB@123..\n

"},{"location":"installation/online_installtion/#3","title":"3 \u5728\u7ebf\u5347\u7ea7","text":"

\u6839\u636e\u4ee5\u4e0b\u6b65\u9aa4\u4f9d\u6b21\u6267\u884c\u8fdb\u884c\u5347\u7ea7\uff1a

\uff081\uff09 \u4e0b\u8f7d\u6700\u65b0\u955c\u50cf

docker pull registry.fit2cloud.com/maxkb/maxkb\n
\uff082\uff09\u67e5\u770b\u5e76\u786e\u8ba4\u4e0a\u4e00\u6b21\u6570\u636e\u6301\u4e45\u5316\u76ee\u5f55\uff0c\u590d\u5236\u4fdd\u5b58
docker inspect maxkb\n

\uff083\uff09\u5220\u9664\u6b63\u5728\u8fd0\u884c\u7684\u3001\u65e7\u7248\u672c\u7684 MaxKB \u5bb9\u5668

docker rm -f maxkb \n

\uff084\uff09\u542f\u52a8\u5e76\u8fd0\u884c\u65b0\u7248\u672c\u7684 MaxKB \u5bb9\u5668

\u6ce8\u610f\uff1a \u52a1\u5fc5\u786e\u8ba4\u6570\u636e\u6301\u4e45\u5316\u76ee\u5f55\uff08\u5373\u547d\u4ee4\u884c\u4e2d -v\u540e\u7684\u76ee\u5f55\uff09\u8981\u8ddf\u7b2c (2) \u6b65\u67e5\u770b\u76ee\u5f55\u4fdd\u6301\u4e00\u81f4\uff0c\u5426\u5219\u542f\u52a8\u540e\u6574\u4e2a\u7cfb\u7edf\u7684\u6570\u636e\u4e3a\u7a7a\u3002

 docker run -d --name=maxkb --restart=always -p 8080:8080 -v ~/.maxkb:/opt/maxkb registry.fit2cloud.com/maxkb/maxkb\n
"},{"location":"installation/tencent/","title":"\u4e91\u5e94\u7528\u90e8\u7f72\u6307\u5357","text":"

\u672c\u6307\u5357\u5c06\u4ecb\u7ecd\u5982\u4f55\u901a\u8fc7\u817e\u8baf\u4e91\u4e2d\u5feb\u901f\u5b89\u88c5 MaxKB \u4e91\u5e94\u7528\u3002

"},{"location":"installation/tencent/#1","title":"1 \u5b89\u88c5\u5e94\u7528","text":"

MaxKB \u793e\u533a\u7248\u5df2\u4e0a\u67b6\u817e\u8baf\u4e91\u4e91\u5e94\u7528\uff0c\u53ef\u76f4\u63a5\u5728\u817e\u8baf\u4e91\u670d\u52a1\u5668\u4e2d\u5feb\u901f\u90e8\u7f72\u3002

\u7b2c\u4e00\u6b65\uff1a\u5173\u8054\u6211\u4eec\u7684\u817e\u8baf\u4e91\u5408\u4f5c\u4f19\u4f34\u8d26\u6237\uff0c\u4eab\u53d7\u66f4\u591a\u4f18\u60e0\u798f\u5229\uff1a\u70b9\u51fb\u94fe\u63a5\u8fdb\u884c\u5173\u8054

\u7b2c\u4e8c\u6b65\uff1a\u76f4\u63a5\u6253\u5f00 MaxKB \u4e91\u5e94\u7528 \u3002

\u7b2c\u4e09\u6b65\uff1a\u9009\u62e9\u5408\u9002\u4e91\u8d44\u6e90\u914d\u7f6e\u3002\u70b9\u51fb\u3010\u5b89\u88c5\u5e94\u7528\u3011\u540e\uff0c\u8bbe\u7f6e\u4e91\u8d44\u6e90\u8bbe\u7f6e\uff0c\u5efa\u8bae\u81f3\u5c11 4C8G \u53ca\u4ee5\u4e0a\u89c4\u683c\u3002

\u7b2c\u56db\u6b65\uff1a\u5b89\u88c5\u548c\u542f\u52a8\u3002\u70b9\u51fb\u3010\u5b89\u88c5\u5e94\u7528\u3011\uff0c\u7b49\u5f85\u540e\u53f0\u5b89\u88c5\u4ee5\u53ca\u670d\u52a1\u542f\u52a8\u3002\u542f\u52a8\u5b8c\u6210\u540e\uff0c\u70b9\u51fb\u3010\u6253\u5f00\u5e94\u7528\u3011\uff0c\u5373\u53ef\u4f7f\u7528\u9ed8\u8ba4\u7684\u7ba1\u7406\u5458\u7528\u6237\u548c\u5bc6\u7801\u767b\u5f55 MaxKB\u3002

\u7528\u6237\u540d\uff1aadmin\n\u9ed8\u8ba4\u5bc6\u7801\uff1aMaxKB@123..\n

"},{"location":"user_manual/chat_to_API/","title":"\u901a\u8fc7API KEY\u8fdb\u884c\u5bf9\u8bdd","text":"

MaxKB \u521b\u5efa\u7684\u5e94\u7528\u652f\u6301\u901a\u8fc7 OpenAI SDK \u683c\u5f0f\u4ee5\u53ca\u63d0\u4f9b\u7cfb\u7edf SDK \u63a5\u5165\uff0c\u4e13\u4e1a\u7248\u5728\u793e\u533a\u7248\u672c\u57fa\u7840\u4e0a\u63d0\u4f9b\u5e73\u53f0\u7ea7\u522b\u7684\u5b8c\u6574 SDK\uff0c\u8be6\u7ec6\u60c5\u51b5\u89c1\uff1a\u7cfb\u7edfAPI\u3002

"},{"location":"user_manual/chat_to_API/#1-openai-api","title":"1 \u6807\u51c6OpenAI API\u683c\u5f0f","text":"

MaxKB \u5e94\u7528\u517c\u5bb9 OpenAI API \u683c\u5f0f\uff0c\u5728 OpenAI API \u539f\u6709\u8c03\u7528\u65b9\u5f0f\u7684\u57fa\u7840\u4e0a\u66ff\u6362\u4e3a MaxKB \u5e94\u7528\u63d0\u4f9b\u7684 Base URL \u4ee5\u53ca API Key \u5373\u53ef\u3002

\u6ce8\u610f\uff1a

  • openai url \u7684\u683c\u5f0f\u4e3a\uff1a Base URL/chat/completions

  • openai Authorization \u7684\u683c\u5f0f\u4e3a\uff1aBearer API Key

# \u5c06 url \u548c Authorization \u66ff\u6362\u4e3a MaxKB \u5e94\u7528\u5b9e\u9645\u771f\u5b9e\u7684 Base URL \u548c API Key\u3002\n\ncurl https://maxkb.fit2cloud.com/chat/api/xxxxxxxx-3fdf-7941-a6f4-0572478f57f6/chat/completions \\\n    -H \"Content-Type: application/json\"  \\\n    -H \"Authorization: Bearer application-xxxxxxxxxx987f1bc06ab16e0ef\"   \\\n    -d '{\n        \"model\": \"gpt-3.5-turbo\",\n        \"messages\": [\n            {\n              \"role\": \"\u4f60\u662f\u676d\u5dde\u98de\u81f4\u4e91\u4fe1\u606f\u79d1\u6280\u6709\u9650\u516c\u53f8\u65d7\u4e0b\u4ea7\u54c1 MaxKB \u77e5\u8bc6\u5e93\u95ee\u7b54\u7cfb\u7edf\u7684\u667a\u80fd\u5c0f\u52a9\u624b\uff0c\u4f60\u7684\u5de5\u4f5c\u662f\u5e2e\u52a9 MaxKB \u7528\u6237\u89e3\u7b54\u4f7f\u7528\u4e2d\u9047\u5230\u7684\u95ee\u9898\uff0c\u7528\u6237\u627e\u4f60\u56de\u7b54\u95ee\u9898\u65f6\uff0c\u4f60\u8981\u628a\u4e3b\u9898\u653e\u5728 MaxKB \u77e5\u8bc6\u5e93\u95ee\u7b54\u7cfb\u7edf\u8eab\u4e0a\u3002\",\n              \"content\": \"MaxKB \u662f\u4ec0\u4e48\uff1f\"\n            }\n        ]\n    }'\n
"},{"location":"user_manual/chat_to_API/#2-api","title":"2 \u7cfb\u7edf API","text":""},{"location":"user_manual/chat_to_API/#21-api","title":"2.1 \u6253\u5f00 API \u6587\u6863","text":"

\u5728\u5e94\u7528\u3010\u6982\u89c8\u3011\u4e2d\uff0c\u70b9\u51fb\u8bbf\u95ee MaxKB API \u5730\u5740\uff0c\u5728 API Key \u4e2d\u521b\u5efa API Key\u3002

"},{"location":"user_manual/chat_to_API/#22-api-key","title":"2.2 API Key \u8ba4\u8bc1","text":"

\u70b9\u51fb\u3010Authorize\u3011\uff0c\u8f93\u5165\u5df2\u521b\u5efa\u7684 API Key\u3002

"},{"location":"user_manual/chat_to_API/#23","title":"2.3 \u83b7\u53d6\u4f1a\u8bdd\u4fe1\u606f","text":"

\u901a\u8fc7\u8c03\u7528 open \u63a5\u53e3\uff0c\u53ef\u4ee5\u751f\u6210\u4f1a\u8bdd id\u3002

"},{"location":"user_manual/chat_to_API/#24","title":"2.4 \u8fdb\u884c\u4f1a\u8bdd","text":"

\u8c03\u7528\u5bf9\u8bdd\u63a5\u53e3\uff0c\u586b\u5165\u5df2\u83b7\u53d6\u7684\u4f1a\u8bdd id\uff0c\u8f93\u5165\u95ee\u9898\u7b49\u53c2\u6570\u4fe1\u606f\uff0c\u5373\u53ef\u8fdb\u884c\u5bf9\u8bdd\u3002

"},{"location":"user_manual/email/","title":"\u90ae\u7bb1\u8bbe\u7f6e","text":"

\u652f\u6301\u7cfb\u7edf\u7ba1\u7406\u5458\u914d\u7f6e\u90ae\u4ef6\u670d\u52a1\u5668\u7684\u76f8\u5173\u4fe1\u606f\uff0c\u4ee5\u4fbf\u7cfb\u7edf\u53ef\u4ee5\u901a\u8fc7\u7535\u5b50\u90ae\u4ef6\u8fdb\u884c\u901a\u77e5\u6216\u5176\u4ed6\u90ae\u4ef6\u76f8\u5173\u7684\u64cd\u4f5c\u3002

"},{"location":"user_manual/user_community/","title":"\u7528\u6237\u7ba1\u7406","text":""},{"location":"user_manual/user_community/#1","title":"1 \u7528\u6237\u5217\u8868","text":"

\u7cfb\u7edf\u7ba1\u7406\u5458\u53ef\u4ee5\u521b\u5efa\u53ca\u7ba1\u7406\u7528\u6237\u3002

"},{"location":"user_manual/user_community/#2","title":"2 \u521b\u5efa\u7528\u6237","text":"

\u652f\u6301\u7cfb\u7edf\u7ba1\u7406\u5458\u521b\u5efa\u7528\u6237\uff1a

  • \u7528\u6237\u540d\uff1a\u7528\u6237\u8d26\u53f7\u4fe1\u606f\uff0c\u4e0d\u652f\u6301\u4fee\u6539\uff1b
  • \u59d3\u540d\uff1a\u7528\u6237\u59d3\u540d\uff1b
  • \u90ae\u7bb1\uff1a\u7528\u6237\u90ae\u7bb1\uff1b
  • \u624b\u673a\u53f7\uff1a\u7528\u6237\u624b\u673a\u53f7\uff1b
  • \u9ed8\u8ba4\u5bc6\u7801\uff1a\u9ed8\u8ba4\u4e3aMaxKB@123..\u3002
  • \u89d2\u8272\u8bbe\u7f6e\uff1a\u9009\u62e9\u666e\u901a\u7528\u6237\u548c\u5de5\u4f5c\u7a7a\u95f4\u89d2\u8272\u65f6\u9700\u8981\u8bbe\u7f6e\u5de5\u4f5c\u7a7a\u95f4\u3002

\u6ce8\u610f\uff1a\u89d2\u8272\u7ba1\u7406\u4e3a\u4f01\u4e1a\u7248 X-Pack \u529f\u80fd\u3002

"},{"location":"user_manual/user_community/#3","title":"3 \u7f16\u8f91\u7528\u6237","text":"

\u7528\u6237\u540d\u4e0d\u53ef\u4ee5\u7f16\u8f91\uff0c\u5176\u4ed6\u5c5e\u6027\u5747\u53ef\u4ee5\u7f16\u8f91\u3002 \u6ce8\u610f\uff1a\u89d2\u8272\u7ba1\u7406\u4e3a\u4f01\u4e1a\u7248 X-Pack \u529f\u80fd\u3002

\u7528\u6237\u72b6\u6001\u5df2\u7981\u7528\uff0c\u5219\u7528\u6237\u65e0\u6cd5\u767b\u5f55 MaxKB\u3002

"},{"location":"user_manual/user_community/#4","title":"4 \u91cd\u7f6e\u5bc6\u7801","text":"

\u7cfb\u7edf\u7ba1\u7406\u5458\u53ef\u4ee5\u7ed9\u6bcf\u4e2a\u7528\u6237\u4fee\u6539\u5bc6\u7801\uff0c\u5728\u7528\u6237\u5217\u8868\u4e2d\uff0c\u70b9\u51fb\u3010\u4fee\u6539\u5bc6\u7801\u3011\uff0c\u5f39\u51fa\u4fee\u6539\u5bc6\u7801\u5bf9\u8bdd\u6846\uff0c\u4fdd\u5b58\u540e\u4fee\u6539\u6210\u529f\u3002

"},{"location":"user_manual/user_community/#5","title":"5 \u5220\u9664\u7528\u6237","text":"

\u5728\u7528\u6237\u5217\u8868\u4e2d\uff0c\u70b9\u51fb\u3010\u5220\u9664\u3011\uff0c\u5f39\u51fa\u63d0\u793a\u6846\uff0c\u786e\u8ba4\u540e\u4ec5\u5220\u9664\u5f53\u524d\u7528\u6237\u3002 \u6ce8\u610f\uff1a\u7cfb\u7edf\u5185\u7f6e admin \u7528\u6237\u4e0d\u80fd\u88ab\u5220\u9664\u3002

"},{"location":"user_manual/user_community/#6","title":"6 \u67e5\u8be2\u7528\u6237","text":"

\u652f\u6301\u901a\u8fc7\u7528\u6237\u540d\u3001\u59d3\u540d\u3001\u90ae\u7bb1\u8fdb\u884c\u7528\u6237\u641c\u7d22\u3002

"},{"location":"user_manual/X-Pack/app_auth/","title":"\u8bbf\u95ee\u9650\u5236","text":"

\u652f\u6301\u901a\u8fc7\u8eab\u4efd\u9a8c\u8bc1\u7684\u65b9\u5f0f\u5bf9\u5e94\u7528\u8fdb\u884c\u8bbf\u95ee\u9650\u5236\uff0c\u8fdb\u4e00\u6b65\u4fdd\u969c\u4fe1\u606f\u5b89\u5168 \u53ef\u8bbe\u7f6e\u3010\u5bc6\u7801\u9a8c\u8bc1\u3011\u6216\u3010\u767b\u5f55\u8ba4\u8bc1\u3011\u3002

\u9009\u62e9\u3010\u767b\u5f55\u8ba4\u8bc1\u3011\u540e\uff0c\u9700\u81f3\u5c11\u542f\u7528\u4e00\u79cd\u767b\u5f55\u65b9\u5f0f\u3002

  • \u3010\u5bf9\u8bdd\u7528\u6237\u3011\u9700\u7ba1\u7406\u5458\u5728\u3010\u7cfb\u7edf\u7ba1\u7406 \u3011\u4e2d\u5bf9\u3010\u5bf9\u8bdd\u7528\u6237\u3011\u4ee5\u53ca\u3010\u7528\u6237\u7ec4\u3011\u91cc\u589e\u5220\u6539\u7528\u6237\u7ec4\u53ca\u7528\u6237\u3002
  • \u3010\u767b\u5f55\u65b9\u5f0f\u3011\u9700\u7ba1\u7406\u5458\u5728\u3010\u7cfb\u7edf\u7ba1\u7406\u3011\u4e2d\u914d\u7f6e \u3010\u767b\u5f55\u8ba4\u8bc1\u3011\uff0c\u4ee5\u53ca\u5728\u3010\u5bf9\u8bdd\u7528\u6237\u3011\u4e2d\u5f00\u542f\u5355\u70b9\u767b\u5f55\u548c\u626b\u7801\u767b\u5f55\u540e\u624d\u4f1a\u663e\u793a\u3002
  • \u3010\u8d26\u53f7\u767b\u5f55\u9a8c\u8bc1\u7801\u8bbe\u7f6e\u3011\u5e94\u7528\u7ba1\u7406\u8005\u53ef\u4ee5\u8bbe\u7f6e\u5bf9\u8bdd\u7528\u6237\u767b\u5f55\u5931\u8d25\u6307\u5b9a\u6b21\u6570\u540e\u542f\u7528\u9a8c\u8bc1\u7801\u6821\u9a8c\u7684\u529f\u80fd\uff0c\u5f53\u7528\u6237\u8fde\u7eed\u767b\u5f55\u5931\u8d25\u6b21\u6570\u8fbe\u5230\u9884\u8bbe\u9608\u503c\u65f6\uff0c\u7cfb\u7edf\u4f1a\u81ea\u52a8\u89e6\u53d1\u9a8c\u8bc1\u7801\u6821\u9a8c\u673a\u5236\uff0c\u6709\u6548\u9632\u8303\u66b4\u529b\u7834\u89e3\u7b49\u5b89\u5168\u98ce\u9669\u3002

\u5e94\u7528\u8eab\u4efd\u9a8c\u8bc1\u5f00\u542f\u540e\uff0c\u901a\u8fc7\u516c\u5f00\u8bbf\u95ee\u94fe\u63a5\u65f6(\u5305\u62ec\u6d6e\u7a97\u6846)\u9700\u8981\u8f93\u5165\u9a8c\u8bc1\u5bc6\u7801\u624d\u53ef\u4ee5\u8fdb\u5165\u95ee\u7b54\u9875\u9762\u3002 \u8bf4\u660e\uff1a \u8eab\u4efd\u9a8c\u8bc1\u5f00\u542f\u540e\uff0c\u901a\u8fc7\u516c\u5f00\u8bbf\u95ee\u94fe\u63a5\u8bbf\u95ee\u5e94\u7528\u65f6\u90fd\u9700\u8981\u8f93\u5165\u9a8c\u8bc1\u5bc6\u7801\uff0c\u5305\u62ec\u6f14\u793a\u4ee5\u53ca\u5168\u5c4f/\u6d6e\u7a97\u6a21\u5f0f\u5d4c\u5165\uff0c\u800c\u5e94\u7528\u63a5\u5165\u5230\u4f01\u4e1a\u5fae\u4fe1\u3001\u516c\u4f17\u53f7\u3001\u9489\u9489\u3001\u98de\u4e66\u5219\u4e0d\u53d7\u5f71\u54cd\u3002

\u5982\u9009\u62e9\u626b\u7801\u767b\u5f55\u65b9\u5f0f\uff08\u5982\u9489\u9489\u3001\u98de\u4e66\u6216\u4f01\u4e1a\u5fae\u4fe1\uff09\uff0c\u5f53\u7528\u6237\u8bbf\u95ee\u5c0f\u52a9\u624b\u8fdb\u884c\u5bf9\u8bdd\u65f6\uff0c\u7cfb\u7edf\u5c06\u81ea\u52a8\u5f39\u51fa\u6240\u9009\u5e73\u53f0\u7684\u626b\u7801\u754c\u9762\u3002\u7528\u6237\u5b8c\u6210\u626b\u7801\u540e\u5373\u53ef\u5feb\u901f\u767b\u5f55\u5e76\u5f00\u59cb\u5bf9\u8bdd

"},{"location":"user_manual/X-Pack/app_chatueser/","title":"\u5bf9\u8bdd\u7528\u6237","text":"

\u652f\u6301\u8bbe\u7f6e\u5141\u8bb8\u8fdb\u5165\u5f53\u524d\u5e94\u7528\u95ee\u7b54\u9875\u9762\u8fdb\u884c\u63d0\u95ee\u7684\u7528\u6237\u7ec4\u53ca\u7528\u6237\u3002

\u82e5\u5bf9\u8bdd\u7528\u6237\u5c5e\u4e8e\u591a\u4e2a\u7528\u6237\u7ec4\uff0c\u4efb\u4e00\u7528\u6237\u7ec4\u88ab\u6388\u6743\u5373\u53ef\u8fdb\u5165\u5e94\u7528\u63d0\u95ee\u3002 \u7528\u6237\u88ab\u79fb\u51fa\u7528\u6237\u7ec4\u540e\uff0c\u5bf9\u5e94\u6388\u6743\u5c06\u88ab\u53d6\u6d88\u3002 \u81ea\u52a8\u6388\u6743\u89c4\u5219\uff1a

  • \u5f00\u542f\uff1a\u5f53\u524d\u7528\u6237\u7ec4\u53ca\u540e\u7eed\u65b0\u589e\u6210\u5458\u81ea\u52a8\u6388\u6743\uff0c\u53ef\u8fdb\u5165\u5e94\u7528\u63d0\u95ee\u3002
  • \u5173\u95ed\uff1a\u9700\u624b\u52a8\u4e3a\u7528\u6237\u7ec4\u6210\u5458\u6388\u6743\uff0c\u65b0\u589e\u6210\u5458\u9ed8\u8ba4\u672a\u6388\u6743\u3002

\u6ce8\u610f\uff1a

  • \u5728\u5e94\u7528\u4e2d\u4ec5\u652f\u6301\u67e5\u770b\u548c\u6388\u6743\u7528\u6237\u7ec4\uff0c\u7528\u6237\u7ec4\u548c\u6210\u5458\u7ba1\u7406\u9700\u8981\u7a7a\u95f4\u7ba1\u7406\u5458\u6216\u7cfb\u7edf\u7ba1\u7406\u5458\u5728\u3010\u7cfb\u7edf\u7ba1\u7406\u3011\u4e2d\u8fdb\u884c\u3002
  • \u672a\u5728\u3010\u8eab\u4efd\u9a8c\u8bc1\u3011\u4e2d\u542f\u7528\u767b\u5f55\u8ba4\u8bc1\uff0c\u5e94\u7528\u5173\u8054\u7684\u5168\u90e8\u77e5\u8bc6\u5e93\u53ef\u88ab\u4efb\u610f\u7528\u6237\u68c0\u7d22\u3002

"},{"location":"user_manual/X-Pack/app_integrate/","title":"\u5e94\u7528\u63a5\u5165","text":"

\u652f\u6301\u521b\u5efa\u7684\u5e94\u7528\u7684\u4e0e\u4f01\u4e1a\u5fae\u4fe1\u667a\u80fd\u673a\u5668\u4eba\u3001\u4f01\u4e1a\u5fae\u4fe1\u5e94\u7528\u3001\u4f01\u4e1a\u5fae\u4fe1\u5ba2\u670d\u3001\u516c\u4f17\u53f7\uff08\u670d\u52a1\u53f7\u548c\u8ba2\u9605\u53f7\uff09\u3001\u9489\u9489\u5e94\u7528\u3001\u98de\u4e66\u5e94\u7528\u63a5\u5165\uff0c\u5b9e\u73b0\u4f01\u4e1a\u5185\u90e8\u5458\u5de5\u3001\u5916\u90e8\u516c\u4f17\u8fdb\u884c\u5bf9\u8bdd\u3002

"},{"location":"user_manual/X-Pack/app_integrate/#1","title":"1 \u4f01\u4e1a\u5fae\u4fe1\u667a\u80fd\u673a\u5668\u4eba","text":"

\u4f01\u4e1a\u5fae\u4fe1\u673a\u5668\u4eba\u652f\u6301\u5728 \u4f01\u4e1a\u5fae\u4fe1\u5185\u90e8\u7fa4\u804a \u4e2d@\u667a\u80fd\u673a\u5668\u4eba\u8fdb\u884c\u95ee\u7b54\u5bf9\u8bdd\u3002

\u5728\u5e94\u7528\u63a5\u5165\u4e2d\u70b9\u51fb\u3010\u4f01\u4e1a\u5fae\u4fe1\u667a\u80fd\u673a\u5668\u4eba\u3011\u7684\u914d\u7f6e\u6309\u94ae\uff0c\u914d\u7f6e\u4fe1\u606f\u4e2d\u4f1a\u81ea\u52a8\u751f\u6210\u56de\u8c03 URL\uff0c\u5e76\u9700\u8981\u590d\u5236\u5230\u4f01\u4e1a\u5fae\u4fe1\u667a\u80fd\u673a\u5668\u4eba\u7684 API \u63a5\u6536\u8bbe\u7f6e\u4e2d\u7684 URL \u4e2d\u3002

\u521b\u5efa\u673a\u5668\u4eba\uff1a\u5728\u4f01\u4e1a\u5fae\u4fe1\u7ba1\u7406\u540e\u53f0\uff0c\u70b9\u51fb \u3010\u5b89\u5168\u4e0e\u7ba1\u7406\u3011-\u3010\u7ba1\u7406\u5de5\u5177\u3011-\u3010\u667a\u80fd\u673a\u5668\u4eba\u3011-\u3010\u521b\u5efa\u673a\u5668\u4eba\u3011\u3002

\u9009\u62e9\u3010API \u6a21\u5f0f\u521b\u5efa\u3011\u3002

\u586b\u5199\u57fa\u672c\u4fe1\u606f\u540e\uff0c\u5728 URL \u4e2d\uff0c\u5199\u5165 MaxKB \u5e94\u7528\u914d\u7f6e\u4e2d\u7684\u56de\u8c03\u5730\u5740\uff0c\u540c\u65f6\uff0c\u5c06\u968f\u673a\u751f\u6210\u7684 Token \u548c Encoding-AESKey \u586b\u5199\u5728 MaxKB \u5e94\u7528\u914d\u7f6e\u4e2d\uff0c\u5e76\u4fdd\u5b58\u5e94\u7528\u914d\u7f6e\u3002\u4fdd\u5b58\u540e\uff0c\u56de\u5230\u4f01\u4e1a\u5fae\u4fe1\u7ba1\u7406\u540e\u53f0\u521b\u5efa\u673a\u5668\u4eba\u3002

\u6ce8\u610f\uff1a \u5728\u4f01\u4e1a\u5fae\u4fe1\u5e94\u7528API\u63a5\u6536\u6d88\u606f\u914d\u7f6e\u4fdd\u5b58\u4e4b\u524d\uff0c\u4e00\u5b9a\u8981\u5728 MaxKB \u4e2d\u5b8c\u6210\u4f01\u4e1a\u5fae\u4fe1\u5e94\u7528\u914d\u7f6e\u5e76\u4fdd\u5b58\uff0c\u4e0d\u7136\u4fdd\u5b58\u65f6\u5c06\u62a5\u9519openapi\u56de\u8c03\u5730\u5740\u8bf7\u6c42\u4e0d\u901a\u8fc7\u3002

\u521b\u5efa\u5b8c\u6210\u540e\uff0c\u5373\u53ef\u5728 \u4f01\u4e1a\u5fae\u4fe1\u5185\u90e8\u7fa4\u804a \u4e2d@\u667a\u80fd\u673a\u5668\u4eba\uff0c\u8fdb\u884c\u63d0\u95ee\u3002

"},{"location":"user_manual/X-Pack/app_integrate/#2","title":"2 \u4f01\u4e1a\u5fae\u4fe1\u5e94\u7528","text":"

\u4f01\u4e1a\u5fae\u4fe1\u5e94\u7528\u5bf9\u63a5\u540e\uff0c\u53ef\u5728\u3010\u4f01\u4e1a\u5fae\u4fe1\u3011-\u3010\u5de5\u4f5c\u53f0\u3011\u7684\u5e94\u7528\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u5e94\u7528\u5e76\u8fdb\u884c\u5bf9\u8bdd

\u5728\u5e94\u7528\u63a5\u5165\u4e2d\u70b9\u51fb\u3010\u4f01\u4e1a\u5fae\u4fe1\u5e94\u7528\u3011\u7684\u3010\u914d\u7f6e\u3011\u6309\u94ae\uff0c\u914d\u7f6e\u4fe1\u606f\u4e2d\u4f1a\u81ea\u52a8\u751f\u6210\u56de\u8c03 URL\uff0c\u5e76\u9700\u8981\u590d\u5236\u5230\u4f01\u4e1a\u5fae\u4fe1\u5e94\u7528\u7684 API \u63a5\u6536\u8bbe\u7f6e\u4e2d\uff0c\u9664\u6b64\u4e4b\u5916\u7684\u5176\u5b83\u4fe1\u606f\uff0c\u5c06\u5728\u4f01\u4e1a\u5fae\u4fe1\u7ba1\u7406\u540e\u53f0\u4e2d\u751f\u6210\u5e76\u83b7\u53d6\u3002

\u83b7\u53d6\u4f01\u4e1aID: \u5728\u4f01\u4e1a\u5fae\u4fe1\u7ba1\u7406\u540e\u53f0\uff0c\u70b9\u51fb \u3010\u6211\u7684\u4f01\u4e1a\u3011\u83dc\u5355\uff0c\u5728\u6700\u4e0b\u65b9\u53ef\u4ee5\u770b\u5230\u4f01\u4e1aID \u4fe1\u606f\u3002

\u521b\u5efa\u4f01\u4e1a\u5fae\u4fe1\u5e94\u7528\uff1a\u5728\u3010\u5e94\u7528\u7ba1\u7406\u3011\u4e2d\u70b9\u51fb\u3010\u521b\u5efa\u5e94\u7528\u3011\uff0c\u9009\u62e9\u5e94\u7528logo\uff0c\u8bbe\u7f6e\u5e94\u7528\u540d\u79f0\u548c\u5e94\u7528\u4ecb\u7ecd\u4ee5\u53ca\u53ef\u89c1\u8303\u56f4\u3002

\u83b7\u53d6 Agentid \u548c Secret:\u8fdb\u5165\u521b\u5efa\u7684\u5e94\u7528\uff0c\u83b7\u53d6 AgentId \u548c Secret\u3002\u70b9\u51fb\u3010\u67e5\u770b\u3011Secret \u5c06\u901a\u8fc7\u4f01\u4e1a\u5fae\u4fe1\u8fdb\u884c\u67e5\u770b\u3002

\u83b7\u53d6 Token \u548c EncodingAESKey\uff1a\u8fdb\u5165\u4f01\u4e1a\u5fae\u4fe1\u5e94\u7528\u8bbe\u7f6e\u7684\u3010\u63a5\u6536\u6d88\u606f\u3011-\u3010\u8bbe\u7f6e API \u63a5\u6536\u3011\uff0c\u968f\u673a\u83b7\u53d6 Token \u548c EncodingAESKey\u3002

\u5728 MaxKB \u4f01\u4e1a\u5fae\u4fe1\u5e94\u7528\u914d\u7f6e\u8f93\u5165\u5bf9\u5e94\u7684\u53c2\u6570\u5e76\u4fdd\u5b58\uff0c\u56de\u5230\u4f01\u4e1a\u5fae\u4fe1\u5e94\u7528\u8bbe\u7f6e\u3010\u63a5\u6536\u6d88\u606f\u3011-\u3010\u8bbe\u7f6eAPI\u63a5\u6536\u3011\u4f01\u4e1a\u5fae\u4fe1\u5e94\u7528\u63a5\u5165\u914d\u7f6e\u4e2d\u81ea\u52a8\u751f\u6210\u7684\u56de\u8c03 URL\uff0c\u6700\u540e\u70b9\u51fb\u3010\u4fdd\u5b58\u3011\u3002

\u6ce8\u610f\uff1a \u5728\u4f01\u4e1a\u5fae\u4fe1\u5e94\u7528API\u63a5\u6536\u6d88\u606f\u914d\u7f6e\u4fdd\u5b58\u4e4b\u524d\uff0c\u4e00\u5b9a\u8981\u5728 MaxKB \u4e2d\u5b8c\u6210\u4f01\u4e1a\u5fae\u4fe1\u5e94\u7528\u914d\u7f6e\u5e76\u4fdd\u5b58\uff0c\u4e0d\u7136\u4fdd\u5b58\u65f6\u5c06\u62a5\u9519openapi\u56de\u8c03\u5730\u5740\u8bf7\u6c42\u4e0d\u901a\u8fc7\u3002

\u6ce8\u610f\uff1a \u5728\u4f01\u4e1a\u5fae\u4fe1\u5e94\u7528API\u63a5\u6536\u6d88\u606f\u914d\u7f6e\u4fdd\u5b58\u4e4b\u524d\uff0c\u4e00\u5b9a\u8981\u5728 MaxKB \u4e2d\u5b8c\u6210\u4f01\u4e1a\u5fae\u4fe1\u5e94\u7528\u914d\u7f6e\u5e76\u4fdd\u5b58\uff0c\u4e0d\u7136\u4fdd\u5b58\u65f6\u5c06\u62a5\u9519openapi\u56de\u8c03\u5730\u5740\u8bf7\u6c42\u4e0d\u901a\u8fc7\u3002

\u914d\u7f6e\u4f01\u4e1a\u53ef\u4fe1 IP\uff1a\u8fdb\u5165\u4f01\u4e1a\u5fae\u4fe1\u5e94\u7528\u8bbe\u7f6e\u7684\u3010\u4f01\u4e1a\u53ef\u4fe1 IP\u3011\u4e2d\uff0c\u628a MaxKB \u670d\u52a1\u7684 IP \u5730\u5740\u8bbe\u7f6e\u4e3a\u53ef\u4fe1 IP\u3002

\u4ee5\u4e0a\u6b65\u9aa4\u914d\u7f6e\u5b8c\u6210\u540e\uff0c\u5e76\u5728\u4f01\u4e1a\u5fae\u4fe1\u5e94\u7528\u63a5\u5165\u914d\u7f6e\u4e2d\u8f93\u5165\u4f01\u4e1a\u5fae\u4fe1\u5e94\u7528\u4fe1\u606f\u540e\u4fdd\u5b58\uff0c\u4fbf\u53ef\u5728\u4f01\u4e1a\u5fae\u4fe1\u5e94\u7528\u4e2d\u627e\u5230\u673a\u5668\u4eba\u8fdb\u884c\u5bf9\u8bdd\u3002

"},{"location":"user_manual/X-Pack/app_integrate/#3","title":"3 \u4f01\u4e1a\u5fae\u4fe1\u5ba2\u670d","text":"

\u4f01\u4e1a\u5fae\u4fe1\u5ba2\u670d\u5bf9\u63a5\u540e\uff0c\u53ef\u4ee5\u5728\u7fa4\u804a\u4e2d@\u5fae\u4fe1\u5ba2\u670d\uff0c\u901a\u8fc7\u8df3\u8f6c\u8fde\u63a5\uff0c\u5b9e\u73b0\u5ba2\u670d\u4e00\u5bf9\u4e00\u95ee\u7b54\u3002

MaxKB \u5e94\u7528\u63a5\u5165\u4f01\u4e1a\u5fae\u4fe1\u5e94\u7528\u540e\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u8fd8\u53ef\u4ee5\u5c06\u6b64\u5e94\u7528\u63a5\u5165\u5230\u5fae\u4fe1\u5ba2\u670d\uff0c\u5bf9\u5916\u90e8\u7528\u6237\u63d0\u4f9b\u670d\u52a1\u3002 \u521b\u5efa\u5ba2\u670d\u8d26\u53f7\uff1a\u5728\u4f01\u4e1a\u5fae\u4fe1\u7ba1\u7406\u540e\u53f0\u7684\u3010\u5e94\u7528\u7ba1\u7406\u3011\u4e2d\uff0c\u70b9\u51fb\u3010\u5fae\u4fe1\u5ba2\u670d\u3011\uff0c\u5e76\u521b\u5efa\u8d26\u53f7,\u5ba2\u670d\u8d26\u53f7\u7684\u63a5\u5f85\u65b9\u5f0f\u9009\u62e9\uff1a\u673a\u5668\u4eba+\u4eba\u5de5\u63a5\u5f85

\u5ba2\u670d\u8d26\u53f7\u4e0e\u5e94\u7528\u5173\u8054\uff1a\u5728\u5fae\u4fe1\u5ba2\u670d\u4e2d\u914d\u7f6e\u3010\u53ef\u8c03\u7528\u63a5\u53e3\u7684\u5e94\u7528\u3011\uff0c\u5e76\u914d\u7f6e\u5ba2\u670d\u8d26\u53f7\u3002

\u5f00\u542f\u5ba2\u670d\u52a9\u7406\uff1a\u5728\u4f01\u4e1a\u7684\u5916\u90e8\u7fa4\u8bbe\u7f6e\u4e2d\u5f00\u542f\u3010\u5ba2\u670d\u52a9\u7406\u3011\uff0c\u5fae\u4fe1\u5ba2\u670d\u4fbf\u4f1a\u52a0\u5165\u7fa4\u4e2d\uff0c\u7fa4\u91cc\u7684\u4efb\u4f55\u7528\u6237\u4ec5\u9700\u8981@\u5ba2\u670d\u52a9\u7406\uff0c\u5373\u53ef\u53d1\u8d77\u54a8\u8be2\uff0c\u5e76\u5fae\u4fe1\u5ba2\u670d\u8fdb\u884c\u4e00\u5bf9\u4e00\u7684\u5bf9\u8bdd\u3002

"},{"location":"user_manual/X-Pack/app_integrate/#4","title":"4 \u5fae\u4fe1\u516c\u4f17\u53f7","text":"

\u5bf9\u63a5\u540e\uff0c\u53ef\u76f4\u63a5\u901a\u8fc7\u5fae\u4fe1\u516c\u4f17\u53f7\u5b9e\u73b0\u95ee\u7b54\u5bf9\u8bdd\u3002

\u5728\u5e94\u7528\u63a5\u5165\u4e2d\u70b9\u51fb\u3010\u516c\u4f17\u53f7\u3011\u7684\u3010\u914d\u7f6e\u3011\u6309\u94ae\uff0c\u914d\u7f6e\u4fe1\u606f\u4e2d\u4f1a\u81ea\u52a8\u751f\u6210\u56de\u8c03 URL,\u5e76\u9700\u8981\u590d\u5236\u5230\u3010\u5fae\u4fe1\u516c\u4f17\u5e73\u53f0-\u8bbe\u7f6e\u4e0e\u5f00\u53d1-\u57fa\u672c\u914d\u7f6e-\u670d\u52a1\u5668\u914d\u7f6e\u3011\u670d\u52a1\u5668\u5730\u5740 URL \u4e2d\uff0c\u9664\u6b64\u4e4b\u5916\u7684\u5176\u5b83\u4fe1\u606f\uff0c\u5c06\u5728\u5fae\u4fe1\u516c\u4f17\u5e73\u53f0\u4e2d\u751f\u6210\u5e76\u83b7\u53d6\u3002

\u83b7\u53d6 APP ID\u3001APP Secret\u3001Token \u548c\u6d88\u606f\u52a0\u89e3\u5bc6\u5bc6\u94a5\uff1a\u5728\u5fae\u4fe1\u516c\u4f17\u5e73\u53f0-\u8bbe\u7f6e\u4e0e\u5f00\u53d1-\u57fa\u672c\u914d\u7f6e\u4e2d\u83b7\u53d6 APP ID\u3001APP Secret \u4fe1\u606f\uff0c\u5e76\u542f\u52a8\u670d\u52a1\u5668\u914d\u7f6e\uff0c\u751f\u6210 Token \u548c\u6d88\u606f\u52a0\u89e3\u5bc6\u5bc6\u94a5\u3002

\u5c06\u751f\u6210\u7684 APP ID\u3001APP Secret\u3001Token \u548c\u6d88\u606f\u52a0\u89e3\u5bc6\u5bc6\u94a5\u4fe1\u606f\u8f93\u5165\u5230 MaxKB \u516c\u4f17\u53f7\u914d\u7f6e\u7a97\u53e3\u4e2d\uff0c\u5e76\u4fdd\u5b58\u3002

\u5c06\u3010\u516c\u4f17\u53f7-\u57fa\u672c\u914d\u7f6e-\u670d\u52a1\u5668\u914d\u7f6e\u3011\u4e2d\u7684 URL \u8bbe\u7f6e\u4e3a MaxKB \u516c\u4f17\u53f7\u914d\u7f6e\u7a97\u53e3\u4e2d\u7684\u56de\u8c03\u5730\u5740 URL\uff0c\u7136\u540e\u63d0\u4ea4\uff0c\u5e76\u542f\u7528\u670d\u52a1\u5668\u914d\u7f6e\u3002

\u5f00\u542f\u5ba2\u670d\u63a5\u53e3\u6743\u9650\u3002

\u8bbe\u7f6e IP \u767d\u540d\u5355\uff1a\u8fdb\u5165\u516c\u4f17\u53f7\u57fa\u672c\u914d\u7f6e\u7684\u3010IP \u767d\u540d\u5355\u3011\u4e2d\uff0c\u6dfb\u52a0 MaxKB \u670d\u52a1\u5668\u7684 IP \u5730\u5740\u3002

\u6839\u636e\u4ee5\u4e0a\u6b65\u9aa4\u5b8c\u6210\u914d\u7f6e\u540e\uff0c\u5373\u53ef\u5728\u516c\u4f17\u53f7\u4e2d\u53d1\u9001\u6d88\u606f\u8fdb\u884c\u5bf9\u8bdd\u3002

"},{"location":"user_manual/X-Pack/app_integrate/#5","title":"5 \u9489\u9489\u5e94\u7528","text":"

\u63a5\u5165\u9489\u9489\u540e\uff0c\u53ef\u5728\u7fa4\u804a\u4e2d@\u673a\u5668\u4eba\uff0c\u8fdb\u884c\u95ee\u7b54\u5bf9\u8bdd\u3002

\u5728\u5e94\u7528\u63a5\u5165\u4e2d\u70b9\u51fb\u3010\u9489\u9489\u5e94\u7528\u3011\u7684\u3010\u914d\u7f6e\u3011\u6309\u94ae\uff0c\u914d\u7f6e\u4fe1\u606f\u4e2d\u4f1a\u81ea\u52a8\u751f\u6210\u56de\u8c03 URL,\u5e76\u9700\u8981\u590d\u5236\u5230\u9489\u9489-\u673a\u5668\u4eba\u8bbe\u7f6e-\u6d88\u606f\u63a5\u6536\u5730\u5740\u4e2d\uff0c\u5176\u5b83\u4fe1\u606f\uff0c\u5c06\u5728\u9489\u9489\u5f00\u653e\u5e73\u53f0\u4e2d\u751f\u6210\u5e76\u83b7\u53d6\u3002

\u521b\u5efa\u673a\u5668\u4eba\uff1a\u5728 \u9489\u9489\u5f00\u653e\u5e73\u53f0\u7684\u3010\u5e94\u7528\u5f00\u53d1\u3011-\u3010\u9489\u9489\u5e94\u7528\u3011\u4e2d\uff0c\u70b9\u51fb\u3010\u521b\u5efa\u5e94\u7528\u3011\uff0c\u586b\u5199\u5e94\u7528\u4fe1\u606f\u540e\uff0c\u70b9\u51fb\u3010\u4fdd\u5b58\u3011\u3002

\u83b7\u53d6 Client ID \u548c Client Secret\uff1a\u8fdb\u5165\u521b\u5efa\u597d\u7684\u9489\u9489\u5e94\u7528\uff0c\u6253\u5f00\u3010\u51ed\u8bc1\u4e0e\u57fa\u7840\u4fe1\u606f\u3011\u9875\u9762\uff0c\u83b7\u53d6 Client ID \u548c Client Secret\u3002

\u5728 MaxKB \u9489\u9489\u5e94\u7528\u914d\u7f6e\u7a97\u53e3\u4e2d\u8f93\u5165\u6b65\u9aa4\u83b7\u53d6\u7684 Client ID \u548c Client Secret \u5e94\u7528\u51ed\u8bc1\uff0c\u5e76\u4fdd\u5b58\u3002

\u70b9\u51fb\u3010\u6dfb\u52a0\u5e94\u7528\u80fd\u529b\u3011\uff0c\u9009\u62e9 \u3010\u673a\u5668\u4eba\u3011\u80fd\u529b\uff0c\u70b9\u51fb \u3010\u6dfb\u52a0\u3011\uff0c\u8f93\u5165\u673a\u5668\u4eba\u57fa\u672c\u914d\u7f6e\u4fe1\u606f\u540e\uff0c\u5c06\u3010\u6d88\u606f\u63a5\u6536\u6a21\u5f0f\u3011\u8bbe\u7f6e\u4e3a HTTP \u6a21\u5f0f\uff0c\u5e76\u5c06 MaxKB \u9489\u9489\u5e94\u7528\u914d\u7f6e\u4e2d\u7684\u56de\u8c03\u5730\u5740\u7684URL\u586b\u5199\u5230\u6d88\u606f\u63a5\u6536\u5730\u5740\u4e2d\uff0c\u7136\u540e\u70b9\u51fb\u3010\u53d1\u5e03\u3011\u3002

\u6839\u636e\u4ee5\u4e0a\u6b65\u9aa4\u5b8c\u6210\u914d\u7f6e\u540e\uff0c\u5c31\u53ef\u4ee5\u7fa4\u91cc@\u673a\u5668\u4eba\u4e2d\u8fdb\u884c\u5bf9\u8bdd\uff0c\u6216\u4e0e\u673a\u5668\u4eba\u5e94\u7528\u4e00\u5bf9\u4e00\u5bf9\u8bdd\u3002

"},{"location":"user_manual/X-Pack/app_integrate/#6","title":"6 \u98de\u4e66\u5e94\u7528","text":"

\u63a5\u5165\u98de\u4e66\u540e\uff0c\u53ef\u5728\u5e94\u7528\u4e2d\u627e\u5230\u5bf9\u5e94\u5e94\u7528\uff0c\u8fdb\u884c\u95ee\u7b54\u5bf9\u8bdd\u3002

\u5728\u5e94\u7528\u63a5\u5165\u4e2d\u70b9\u51fb\u3010\u98de\u4e66\u5e94\u7528\u3011\u7684\u3010\u914d\u7f6e\u3011\u6309\u94ae\uff0c\u914d\u7f6e\u4fe1\u606f\u4e2d\u4f1a\u81ea\u52a8\u751f\u6210\u56de\u8c03 URL\uff0c\u5e76\u9700\u8981\u590d\u5236\u5230\u3010\u98de\u4e66\u5f00\u653e\u5e73\u53f0-\u4e8b\u4ef6\u4e0e\u56de\u8c03-\u4e8b\u4ef6\u914d\u7f6e-\u914d\u7f6e\u8ba2\u9605\u65b9\u5f0f\u3011\u7684\u8bf7\u6c42\u5730\u5740\u4e2d\uff0c\u9664\u6b64\u4e4b\u5916\u7684\u5176\u5b83\u4fe1\u606f\uff0c\u5c06\u5728\u98de\u4e66\u5f00\u653e\u5e73\u53f0\u4e2d\u751f\u6210\u5e76\u83b7\u53d6\u3002

\u521b\u5efa\u98de\u4e66\u673a\u5668\u4eba\uff1a\u9996\u5148\u5728 \u98de\u4e66\u5f00\u53d1\u5e73\u53f0\u7684\u3010\u4f01\u4e1a\u81ea\u5efa\u5e94\u7528\u3011\u4e2d\uff0c\u70b9\u51fb\u3010\u521b\u5efa\u4f01\u4e1a\u81ea\u5efa\u5e94\u7528\u3011\uff0c\u586b\u5199\u5e94\u7528\u4fe1\u606f\u3002

\u70b9\u51fb\u3010\u6dfb\u52a0\u5e94\u7528\u80fd\u529b\u3011\uff0c\u9009\u62e9 \u3010\u6309\u80fd\u529b\u6dfb\u52a0-\u673a\u5668\u4eba\u3011\uff0c\u70b9\u51fb\u3010\u6dfb\u52a0\u3011

\u6dfb\u52a0\u6743\u9650\uff1a\u6253\u5f00\u3010\u6743\u9650\u7ba1\u7406\u3011\uff0c\u590d\u5236\u4e0b\u9762\u7684\u6743\u9650\u914d\u7f6e\u5e76\u7c98\u8d34\u5230\u3010API \u6743\u9650-\u6743\u9650\u914d\u7f6e\u3011\u8f93\u5165\u6846\uff0c\u5168\u9009\u7b5b\u9009\u51fa\u6765\u7684\u6743\u9650\u9879\uff0c\u70b9\u51fb\u3010\u6279\u91cf\u5f00\u901a\u3011\uff0c\u6700\u540e\u70b9\u51fb\u3010\u786e\u8ba4\u3011\u3002

 m:message,im:message.group_at_msg:readonly,im:message.p2p_msg:readonly,im:message:send_as_bot,im:resource, contact:contact.base:readonly\uff0ccontact:user.base:readonly\n

\u83b7\u53d6 APP ID\u3001APP Secret \u548c Verification Token\uff1a\u8fdb\u5165\u521b\u5efa\u597d\u7684\u98de\u4e66\u5e94\u7528\uff0c\u6253\u5f00\u3010\u51ed\u8bc1\u4e0e\u57fa\u7840\u4fe1\u606f\u3011\u9875\u9762\uff0c\u83b7\u53d6 APP ID \u548c APP Secret\u3002

\u6253\u5f00\u3010\u4e8b\u4ef6\u4e0e\u56de\u8c03-\u52a0\u5bc6\u7b56\u7565\u3011\uff0c\u83b7\u53d6 Verification Token\u3002

\u5728 MaxKB \u98de\u4e66\u5e94\u7528\u914d\u7f6e\u7a97\u53e3\u8f93\u5165\u4e0a\u8ff0\u4fe1\u606f\uff0c\u5e76\u4fdd\u5b58\u3002

\u914d\u7f6e\u56de\u8c03URL\uff1a\u5728\u98de\u4e66\u5f00\u653e\u5e73\u53f0\u4e2d\u6253\u5f00\u3010\u4e8b\u4ef6\u4e0e\u56de\u8c03\u3011-\u3010\u56de\u8c03\u914d\u7f6e\u3011\u7684\u8ba2\u9605\u65b9\u5f0f\u4e2d\uff0c\u5c06MaxKB\u4e2d\u98de\u4e66\u5e94\u7528\u7684\u56de\u8c03\u5730\u5740\u7684URL\u586b\u5199\u5230\u3010\u8bf7\u6c42\u5730\u5740\u3011\u4e2d\u3002

\u53d1\u5e03\u5e94\u7528\uff1a\u70b9\u51fb\u3010\u521b\u5efa\u7248\u672c\u3011\uff0c\u586b\u5199\u7248\u672c\u4fe1\u606f\u540e\uff0c\u70b9\u51fb\u3010\u4fdd\u5b58\u3011\u3002

\u786e\u8ba4\u53d1\u5e03\u540e\uff0c\u5e94\u7528\u72b6\u6001\u5c06\u66f4\u65b0\u4e3a\u5df2\u542f\u7528\u3002

\u6839\u636e\u4ee5\u4e0a\u6b65\u9aa4\u5b8c\u6210\u914d\u7f6e\u540e\uff0c\u5373\u53ef\u6253\u5f00\u98de\u4e66\u5ba2\u6237\u7aef\u641c\u7d22MaxKB\u5c0f\u52a9\u624b\uff0c\u70b9\u51fb\u3010\u6dfb\u52a0\u3011\u540e\u8fdb\u884c\u4e00\u5bf9\u4e00\u5bf9\u8bdd\u3002

"},{"location":"user_manual/X-Pack/app_logo_settting/","title":"\u5e94\u7528\u663e\u793a\u8bbe\u7f6e","text":"

\u9664\u4e86\u652f\u6301\u8bed\u8a00\u3001\u663e\u793a\u77e5\u8bc6\u7684\u6765\u6e90\u3001\u663e\u793a\u6267\u884c\u8be6\u60c5\uff0cX-Pack \u8fd8\u652f\u6301\u66f4\u4e30\u5bcc\u7684\u914d\u7f6e\uff0c\u5305\u62ec\u5e94\u7528\u5bf9\u8bdd\u6846\u4e3b\u9898\u989c\u8272\u3001\u5b57\u4f53\u989c\u8272\u3001AI \u56de\u590d\u5934\u50cf\u663e\u793a\u548c\u66ff\u6362\u3001\u63d0\u95ee\u7528\u6237\u5934\u50cf\u7684\u663e\u793a\u548c\u66ff\u6362\u3001\u6d6e\u7a97\u5165\u5e93\u5165\u53e3\u56fe\u6807\u4ee5\u53ca\u4f4d\u7f6e\u3001\u5386\u53f2\u8bb0\u5f55\u3001\u5f15\u5bfc\u56fe\u4ee5\u53ca\u514d\u8d23\u58f0\u660e\u7b49\u3002

\u5e94\u7528\u663e\u793a\u914d\u7f6e\u6548\u679c\u793a\u4f8b\u56fe\uff1a

"},{"location":"user_manual/X-Pack/authorization_resources/","title":"\u8d44\u6e90\u6388\u6743","text":"

\u8d44\u6e90\u6388\u6743\u529f\u80fd\u7528\u4e8e\u7ba1\u7406\u7528\u6237\u5bf9\u5de5\u4f5c\u7a7a\u95f4\u5185\u8d44\u6e90\u7684\u8bbf\u95ee\u6743\u9650\u3002

  • \u7cfb\u7edf\u7ba1\u7406\u5458\u53ef\u4ee5\u5728\u3010\u7cfb\u7edf\u7ba1\u7406\u3011\u4e2d\u5bf9\u6240\u6709\u8d44\u6e90\u8fdb\u884c\u6388\u6743\uff1b
  • \u5de5\u4f5c\u7a7a\u95f4\u7ba1\u7406\u5458\u53ef\u4ee5\u5728\u5de5\u4f5c\u7a7a\u95f4\u4e2d\uff0c\u5bf9\u5de5\u4f5c\u7a7a\u95f4\u5185\u7684\u6240\u6709\u8d44\u6e90\u8fdb\u884c\u6388\u6743\uff1b
  • \u666e\u901a\u7528\u6237\u53ef\u4ee5\u5bf9\u81ea\u5df1\u521b\u5efa\u7684\u8d44\u6e90\u8fdb\u884c\u6388\u6743\uff1b
"},{"location":"user_manual/X-Pack/authorization_resources/#1","title":"1 \u7cfb\u7edf\u8d44\u6e90\u6388\u6743","text":"

\u7cfb\u7edf\u7ba1\u7406\u5458\uff08\u6240\u6709\u5de5\u4f5c\u7a7a\u95f4\uff09\u548c\u5de5\u4f5c\u7a7a\u95f4\u7ba1\u7406\u5458\uff08\u4ec5\u53ef\u4ee5\u9009\u62e9\u4f5c\u4e3a\u5de5\u4f5c\u7a7a\u95f4\u7ba1\u7406\u5458\u89d2\u8272\u7684\u5de5\u4f5c\u7a7a\u95f4\uff09\u53ef\u8fdb\u884c\u8d44\u6e90\u6388\u6743\u64cd\u4f5c\uff1a

  • \u6210\u5458\uff1a\u5217\u51fa\u6240\u9009\u5de5\u4f5c\u7a7a\u95f4\u4e0b\u7684\u542b\u6709\u666e\u901a\u7528\u6237\u53ca\u7ee7\u627f\u666e\u901a\u7528\u6237\u89d2\u8272\u7684\u6210\u5458\u3002
  • \u8d44\u6e90\uff1a\u5e94\u7528\u3001\u77e5\u8bc6\u5e93\u3001\u5de5\u5177\u3001\u6a21\u578b\u6309\u5de5\u4f5c\u7a7a\u95f4\u7684\u6587\u4ef6\u5939\u7ba1\u7406\u76ee\u5f55\u5217\u51fa\u6240\u9009\u5de5\u4f5c\u7a7a\u95f4\u4e0b\u7684\u8d44\u6e90\u3002
  • \u64cd\u4f5c\uff1a
    • \u4e0d\u6388\u6743\uff1a\u9ed8\u8ba4\u5bf9\u8d44\u6e90\u4e0d\u8fdb\u884c\u6388\u6743\u3002
    • \u67e5\u770b\uff1a\u4ec5\u80fd\u67e5\u770b\u548c\u4f7f\u7528\u8d44\u6e90\uff0c\u4e0d\u80fd\u5bf9\u8be5\u8d44\u6e90\u8fdb\u884c\u589e\u5220\u6539\u64cd\u4f5c\u3002
    • \u7ba1\u7406\uff1a\u53ef\u4ee5\u5bf9\u8be5\u8d44\u6e90\u8fdb\u884c\u6240\u6709\u64cd\u4f5c\u3002
    • \u6309\u7528\u6237\u89d2\u8272\uff1a\u5bf9\u6240\u9009\u7684\u8d44\u6e90\uff0c\u6309\u7167\u89d2\u8272\u62e5\u6709\u7684\u6743\u9650\u8d4b\u4e88\u7528\u6237\u6743\u9650\u3002

\u6ce8\u610f\uff1a\u5de5\u4f5c\u7a7a\u95f4\u4ee5\u53ca\u8d44\u6e90\u6743\u9650\u4e3a\u4f01\u4e1a\u7248 X-Pack \u529f\u80fd\uff1a

"},{"location":"user_manual/X-Pack/authorization_resources/#2","title":"2 \u7528\u6237\u8d44\u6e90\u6388\u6743","text":"

\u7528\u6237\u53ef\u4ee5\u5728\u5e94\u7528\u3001\u77e5\u8bc6\u5e93\u3001\u5de5\u5177\u548c\u6a21\u578b\u4e2d\uff0c\u5c06\u8d44\u6e90\u6388\u6743\u7ed9\u6307\u5b9a\u7684\u7528\u6237\uff0c\u6388\u6743\u7684\u7528\u6237\u4e3a\u5f53\u524d\u5de5\u4f5c\u7a7a\u95f4\u4e0b\u7684\u6240\u6709\u6210\u5458\u3002

"},{"location":"user_manual/X-Pack/authorization_resources/#3","title":"3 \u8d44\u6e90\u6388\u6743\u89c4\u5219","text":"
  • \u9ed8\u8ba4\u5bf9\u7cfb\u7edf\u7ba1\u7406\u5458\u7684\u6388\u6743\u662f\u6309\u7528\u6237\u89d2\u8272\uff0c\u4fee\u6539\u5de5\u4f5c\u7a7a\u95f4\u7ba1\u7406\u5458\u548c\u7cfb\u7edf\u7ba1\u7406\u5458\u4e0d\u5f71\u54cd\u4e8c\u8005\u5bf9\u8d44\u6e90\u7684\u89d2\u8272\u6743\u9650\uff08\u4f18\u5148\u7ea7\u9ad8\uff09\uff1b
  • \u5f53\u666e\u901a\u7528\u6237\u88ab\u6388\u4e88\u3010\u7ba1\u7406\u3011\u6743\u9650\u65f6\uff0c\u4e5f\u53ef\u5bf9\u5e94\u7528\u8fdb\u884c\u8d44\u6e90\u6388\u6743\u64cd\u4f5c\uff0c\u4f46\u9700\u9075\u5b88\u89d2\u8272\u6743\u9650\u6700\u9ad8\u89c4\u5219;
  • \u5982\u679c\u6210\u5458\u6709\u591a\u4e2a\u89d2\u8272\uff0c\u53d6\u6240\u6709\u89d2\u8272\u7684\u6700\u5927\u6743\u9650\uff08\u5e76\u96c6\uff09\u8fdb\u884c\u6388\u6743\u3002
"},{"location":"user_manual/X-Pack/chat_authentication/","title":"\u767b\u5f55\u8ba4\u8bc1","text":"

\u652f\u6301\u901a\u8fc7\u8eab\u4efd\u9a8c\u8bc1\u7684\u65b9\u5f0f\u5bf9\u5e94\u7528\u8fdb\u884c\u8bbf\u95ee\u9650\u5236\uff0c\u8fdb\u4e00\u6b65\u4fdd\u969c\u4fe1\u606f\u5b89\u5168 \u53ef\u8bbe\u7f6e\u3010\u5bc6\u7801\u9a8c\u8bc1\u3011\u6216\u3010\u767b\u5f55\u8ba4\u8bc1\u3011\u3002

\u9009\u62e9\u3010\u767b\u5f55\u8ba4\u8bc1\u3011\u540e\uff0c\u9700\u81f3\u5c11\u542f\u7528\u4e00\u79cd\u767b\u5f55\u65b9\u5f0f\u3002

  • \u3010\u5bf9\u8bdd\u7528\u6237\u3011\u9700\u7ba1\u7406\u5458\u5728\u3010\u7cfb\u7edf\u7ba1\u7406 \u3011\u4e2d\u5bf9\u3010\u5bf9\u8bdd\u7528\u6237\u3011\u4ee5\u53ca\u3010\u7528\u6237\u7ec4\u3011\u91cc\u589e\u5220\u6539\u7528\u6237\u7ec4\u53ca\u7528\u6237\u3002
  • \u3010\u767b\u5f55\u65b9\u5f0f\u3011\u9700\u7ba1\u7406\u5458\u5728\u3010\u7cfb\u7edf\u7ba1\u7406\u3011\u4e2d\u914d\u7f6e \u3010\u767b\u5f55\u8ba4\u8bc1\u3011\uff0c\u4ee5\u53ca\u5728\u3010\u5bf9\u8bdd\u7528\u6237\u3011\u4e2d\u5f00\u542f\u5355\u70b9\u767b\u5f55\u548c\u626b\u7801\u767b\u5f55\u540e\u624d\u4f1a\u663e\u793a\u3002

\u5e94\u7528\u8eab\u4efd\u9a8c\u8bc1\u5f00\u542f\u540e\uff0c\u901a\u8fc7\u516c\u5f00\u8bbf\u95ee\u94fe\u63a5\u65f6(\u5305\u62ec\u6d6e\u7a97\u6846)\u9700\u8981\u8f93\u5165\u9a8c\u8bc1\u5bc6\u7801\u624d\u53ef\u4ee5\u8fdb\u5165\u95ee\u7b54\u9875\u9762\u3002 \u8bf4\u660e\uff1a \u8eab\u4efd\u9a8c\u8bc1\u5f00\u542f\u540e\uff0c\u901a\u8fc7\u516c\u5f00\u8bbf\u95ee\u94fe\u63a5\u8bbf\u95ee\u5e94\u7528\u65f6\u90fd\u9700\u8981\u8f93\u5165\u9a8c\u8bc1\u5bc6\u7801\uff0c\u5305\u62ec\u6f14\u793a\u4ee5\u53ca\u5168\u5c4f/\u6d6e\u7a97\u6a21\u5f0f\u5d4c\u5165\uff0c\u800c\u5e94\u7528\u63a5\u5165\u5230\u4f01\u4e1a\u5fae\u4fe1\u3001\u516c\u4f17\u53f7\u3001\u9489\u9489\u3001\u98de\u4e66\u5219\u4e0d\u53d7\u5f71\u54cd\u3002

"},{"location":"user_manual/X-Pack/chat_user/","title":"\u5bf9\u8bdd\u7528\u6237","text":"

\u5bf9\u8bdd\u7528\u6237\u662f\u7ecf\u8fc7\u8eab\u4efd\u9a8c\u8bc1\u540e\uff0c\u80fd\u591f\u5728\u95ee\u7b54\u9875\u9762\u8fdb\u884c\u63d0\u95ee\u7684\u7528\u6237\u3002\u7ba1\u7406\u5458\u53ef\u4ee5\u901a\u8fc7\u7528\u6237\u7ec4\u7ba1\u7406\u529f\u80fd\uff0c\u5728\u3010\u5e94\u7528\u3011\u548c\u3010\u77e5\u8bc6\u5e93\u3011\u7075\u6d3b\u63a7\u5236\u54ea\u4e9b\u7528\u6237\u53ef\u4ee5\u8bbf\u95ee\u95ee\u7b54\u9875\u9762\u548c\u4f7f\u7528\u77e5\u8bc6\u5e93\uff0c\u5e76\u4e3a\u4e0d\u540c\u7528\u6237\u7ec4\u5206\u914d\u4e0d\u540c\u7684\u6743\u9650\u3002 \u6743\u9650\u8bf4\u660e\uff1a

  • \u7cfb\u7edf\u7ba1\u7406\u5458\uff1a\u53ef\u7ba1\u7406\u5bf9\u8bdd\u7528\u6237\u3001\u7528\u6237\u7ec4\u3001\u767b\u5f55\u8ba4\u8bc1\u3002
  • \u5de5\u4f5c\u7a7a\u95f4\u7ba1\u7406\u5458\uff1a\u53ef\u7ba1\u7406\u5bf9\u8bdd\u7528\u6237\u548c\u7528\u6237\u7ec4\u3002
"},{"location":"user_manual/X-Pack/chat_user/#1","title":"1 \u7528\u6237\u7ba1\u7406","text":""},{"location":"user_manual/X-Pack/chat_user/#11","title":"1.1 \u521b\u5efa\u7528\u6237","text":"

\u7ba1\u7406\u5458\u53ef\u4ee5\u521b\u5efa\u548c\u5220\u9664\u5bf9\u8bdd\u7528\u6237\u3002\u7528\u6237\u4fe1\u606f\u5305\u62ec\uff1a

  • \u7528\u6237\u540d\uff1a4-20\u4e2a\u5b57\u7b26\uff0c\u5fc5\u586b\u4e14\u552f\u4e00\u3002
  • \u59d3\u540d\uff1a1-20\u4e2a\u5b57\u7b26\uff0c\u5fc5\u586b\u4e14\u552f\u4e00\u3002
  • \u72b6\u6001\uff1a\u6b63\u5e38/\u7981\u7528\u3002\u7981\u7528\u540e\uff0c\u7528\u6237\u65e0\u6cd5\u8bbf\u95ee\u7cfb\u7edf\u7684\u4efb\u4f55\u529f\u80fd\u3002
  • \u90ae\u7bb1\u3001\u624b\u673a\u53f7\uff1a\u975e\u5fc5\u586b\u3002
  • \u5bc6\u7801\uff1a\u5fc5\u586b\uff0c\u89c4\u5219\u540c\u7cfb\u7edf\u7528\u6237\u3002\u7b2c\u4e09\u65b9\u7528\u6237\u7684\u9ed8\u8ba4\u5bc6\u7801\u4e3aProfile\u914d\u7f6e\u4e2d\u7684\u5bc6\u7801\uff08\u4f8b\u5982\uff1aMaxKB@123\uff09\u3002
  • \u7528\u6237\u7ec4\uff1a\u4e00\u4e2a\u7528\u6237\u53ef\u4ee5\u5c5e\u4e8e\u591a\u4e2a\u7528\u6237\u7ec4\uff0c\u4e5f\u53ef\u4ee5\u4e0d\u9009\u62e9\u4efb\u4f55\u7528\u6237\u7ec4\u3002
  • \u7528\u6237\u6765\u6e90\uff1a\u672c\u5730\u521b\u5efa\u3002
  • \u521b\u5efa\u65f6\u95f4\uff1a\u81ea\u52a8\u8bb0\u5f55\u7528\u6237\u7684\u521b\u5efa\u65f6\u95f4\u3002

\u9664\u7528\u6237\u540d\u5916\uff0c\u5176\u4ed6\u5c5e\u6027\u5747\u53ef\u7f16\u8f91\u4fee\u6539\u3002

\u7ba1\u7406\u5458\u53ef\u4ee5\u4fee\u6539\u5bf9\u8bdd\u7528\u6237\u8d26\u53f7\u7684\u767b\u5f55\u5bc6\u7801\uff0c\u5bc6\u7801\u89c4\u5219\u4e0e\u7cfb\u7edf\u7528\u6237\u4e00\u81f4\u3002

"},{"location":"user_manual/X-Pack/chat_user/#12","title":"1.2 \u8bbe\u7f6e\u7528\u6237\u7ec4","text":"

\u8bbe\u7f6e\u7528\u6237\u7ec4\u3002\u652f\u6301\u591a\u4e2a\u5bf9\u8bdd\u7528\u6237\u6279\u91cf\u8bbe\u7f6e\u7528\u6237\u7ec4\u3002

  • \u52fe\u9009\u9700\u8981\u8bbe\u7f6e\u7684\u5bf9\u8bdd\u7528\u6237\u3002
  • \u70b9\u51fb\u3010\u8bbe\u7f6e\u7528\u6237\u7ec4\u3011\u6309\u94ae\uff0c\u5f39\u51fa\u8bbe\u7f6e\u5bf9\u8bdd\u6846\u3002
  • \u9009\u62e9\u8bbe\u7f6e\u65b9\u5f0f\uff1a
    • \u8ffd\u52a0\uff1a\u4e3a\u6240\u9009\u7528\u6237\u8ffd\u52a0\u65b0\u7684\u7528\u6237\u7ec4\u3002
    • \u66ff\u6362\uff1a\u5220\u9664\u6240\u9009\u7528\u6237\u539f\u6709\u7684\u7528\u6237\u7ec4\uff0c\u8bbe\u7f6e\u65b0\u7684\u7528\u6237\u7ec4\u3002

"},{"location":"user_manual/X-Pack/chat_user/#13","title":"1.3 \u540c\u6b65\u7528\u6237","text":"

\u4ec5\u7cfb\u7edf\u7ba1\u7406\u5458\u53ef\u4ee5\u6267\u884c\u6b64\u64cd\u4f5c\uff0c\u5de5\u4f5c\u7a7a\u95f4\u7ba1\u7406\u5458\u65e0\u6b64\u529f\u80fd\u3002\u540c\u6b65\u65f6\uff1a

  • \u7528\u6237\u6765\u6e90\uff1a\u652f\u6301\u540c\u6b65\u7cfb\u7edf\u7528\u6237\u3002
  • \u540c\u6b65\u5b57\u6bb5\uff1a\u7528\u6237\u540d\u3001\u59d3\u540d\u3001\u90ae\u7bb1\u3001\u624b\u673a\u53f7\u3001\u72b6\u6001\u3001\u5bc6\u7801\u3001\u7528\u6237\u7c7b\u578b\u3002
  • \u7528\u6237\u7ec4\uff1a\u540c\u6b65\u7684\u7528\u6237\u5c06\u88ab\u5206\u914d\u5230\u9ed8\u8ba4\u7528\u6237\u7ec4\u3002
  • \u7528\u6237\u7c7b\u578b\uff1a\u4e0e\u7cfb\u7edf\u7528\u6237\u4fdd\u6301\u4e00\u81f4\u3002
  • \u540c\u6b65\u903b\u8f91\uff1a\u5df2\u5b58\u5728\u7684\u7528\u6237\u5c06\u88ab\u8df3\u8fc7\uff0c\u4e0d\u4f1a\u91cd\u590d\u6dfb\u52a0\u6216\u66f4\u65b0\u3002

"},{"location":"user_manual/X-Pack/chat_user/#2","title":"2 \u7528\u6237\u7ec4\u7ba1\u7406","text":"

\u7528\u6237\u7ec4\u662f\u5bf9\u8bdd\u7528\u6237\u7ba1\u7406\uff0c\u7528\u4e8e\u5c06\u7528\u6237\u5206\u7c7b\u5e76\u96c6\u4e2d\u7ba1\u7406\u3002\u901a\u8fc7\u7528\u6237\u7ec4\uff0c\u7ba1\u7406\u5458\u53ef\u4ee5\u4e3a\u4e0d\u540c\u7c7b\u578b\u7684\u7528\u6237\u5206\u914d\u4e0d\u540c\u7684\u6743\u9650\u3002 \u7cfb\u7edf\u7ba1\u7406\u5458\u548c\u5de5\u4f5c\u7a7a\u95f4\u7ba1\u7406\u5458\u53ef\u4ee5\u8fdb\u884c\u4ee5\u4e0b\u64cd\u4f5c\uff1a

  • \u6dfb\u52a0\u7528\u6237\u7ec4\uff1a\u521b\u5efa\u65b0\u7684\u7528\u6237\u7ec4\u3002
  • \u5220\u9664/\u91cd\u547d\u540d\u7528\u6237\u7ec4\uff1a\u7edf\u5185\u7f6e\u4e00\u4e2a\u9ed8\u8ba4\u7528\u6237\u7ec4\uff0c\u8be5\u7528\u6237\u7ec4\u4e0d\u53ef\u5220\u9664\uff0c\u4f46\u53ef\u4ee5\u91cd\u547d\u540d\u3002
  • \u6dfb\u52a0/\u79fb\u9664\u6210\u5458\uff1a\u4e3a\u7528\u6237\u7ec4\u6dfb\u52a0\u6216\u79fb\u9664\u6210\u5458\uff0c\u652f\u6301\u6279\u91cf\u64cd\u4f5c\u3002

\u7528\u6237\u7ec4\u540d\u79f0\u662f\u552f\u4e00\uff0c\u6700\u5927 128 \u4e2a\u5b57\u7b26\u3002

\u5220\u9664\u7528\u6237\u7ec4\u65f6\uff0c\u7cfb\u7edf\u4f1a\u63d0\u793a\u786e\u8ba4\u64cd\u4f5c\uff0c\u5e76\u63d0\u9192\u7ba1\u7406\u5458\u8be5\u7528\u6237\u7ec4\u4e0b\u7684\u6240\u6709\u6210\u5458\u5c06\u88ab\u79fb\u9664\u3002

\u652f\u6301\u7ed9\u7528\u6237\u7ec4\u6dfb\u52a0\u6210\u5458\u3002

"},{"location":"user_manual/X-Pack/chat_user/#3","title":"3 \u767b\u5f55\u8ba4\u8bc1","text":"

\u7cfb\u7edf\u652f\u6301\u7075\u6d3b\u914d\u7f6e\u5bf9\u8bdd\u7528\u6237\u7684\u767b\u5f55\u8ba4\u8bc1\u65b9\u5f0f\uff0c\u5305\u62ec\u96c6\u6210\u4e3b\u6d41\u7b2c\u4e09\u65b9\u5e73\u53f0\u7684\u626b\u7801\u767b\u5f55\u529f\u80fd\uff0c\u9002\u7528\u4e8e\u6784\u5efa\u5b89\u5168\u3001\u9ad8\u6548\u3001\u7edf\u4e00\u7684\u5bf9\u8bdd\u7528\u6237\u7ba1\u7406\u4f53\u7cfb\u3002

\u767b\u5f55\u8ba4\u8bc1\u914d\u7f6e\u5b8c\u6210\u540e\uff0c\u53ef\u4ee5\u5728\u3010\u5e94\u7528\u3011- \u3010\u6982\u89c8\u3011 - \u3010\u8bbf\u95ee\u9650\u5236\u3011\u4e2d\u663e\u793a\u8be5\u767b\u5f55\u65b9\u5f0f\u3002

\u5982\u9009\u62e9\u626b\u7801\u767b\u5f55\u65b9\u5f0f\uff08\u5982\u9489\u9489\u3001\u98de\u4e66\u6216\u4f01\u4e1a\u5fae\u4fe1\uff09\uff0c\u5f53\u7528\u6237\u8bbf\u95ee\u5c0f\u52a9\u624b\u8fdb\u884c\u5bf9\u8bdd\u65f6\uff0c\u7cfb\u7edf\u5c06\u81ea\u52a8\u5f39\u51fa\u6240\u9009\u5e73\u53f0\u7684\u626b\u7801\u754c\u9762\u3002\u7528\u6237\u5b8c\u6210\u626b\u7801\u540e\u5373\u53ef\u5feb\u901f\u767b\u5f55\u5e76\u5f00\u59cb\u5bf9\u8bdd

"},{"location":"user_manual/X-Pack/chat_user/#4","title":"4 \u4f7f\u7528\u573a\u666f","text":"

\u7cfb\u7edf\u7ba1\u7406\u5458\u8bbe\u7f6e\u5b8c\u7528\u6237\u5bf9\u8bdd\u7528\u6237\uff0c\u7528\u6237\u5728\u521b\u5efa\u5e94\u7528\u548c\u77e5\u8bc6\u5e93\u65f6\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u5bf9\u8bdd\u7528\u6237\u7ec4\u6765\u63a7\u5236\u4f7f\u7528\u76f8\u5173\u6743\u9650\u3002

"},{"location":"user_manual/X-Pack/feishu_doc/","title":"\u98de\u4e66\u6587\u6863\u77e5\u8bc6\u5e93","text":""},{"location":"user_manual/X-Pack/feishu_doc/#1","title":"1 \u98de\u4e66\u673a\u5668\u4eba\u914d\u7f6e","text":"

\u652f\u6301\u901a\u8fc7\u98de\u4e66\u6587\u6863\u6784\u5efa\u77e5\u8bc6\u5e93\uff0c\u76ee\u524d\u652f\u6301\u98de\u4e66\u7684\u4e91\u6587\u6863\u548c\u8868\u683c\u6587\u6863\u3002 \u6ce8\u610f\uff1a\u5bf9\u98de\u4e66\u6587\u6863\u7684\u652f\u6301\u662f\u901a\u8fc7\u98de\u4e66\u673a\u5668\u4eba\u5e76\u914d\u7f6e\u5bf9\u5e94\u7684\u6587\u6863\u6743\u9650\u5b9e\u73b0\uff0c\u5e76\u5728\u7fa4\u7ec4\u4e2d\u901a\u8fc7\u5c06\u673a\u5668\u4eba\u8bbe\u7f6e\u4e3a\u534f\u4f5c\u8005\u3002

"},{"location":"user_manual/X-Pack/feishu_doc/#11","title":"1.1 \u521b\u5efa\u98de\u4e66\u673a\u5668\u4eba","text":"

\u9996\u5148\u5728 \u98de\u4e66\u5f00\u53d1\u5e73\u53f0\u7684\u3010\u4f01\u4e1a\u81ea\u5efa\u5e94\u7528\u3011\u4e2d\uff0c\u70b9\u51fb\u3010\u521b\u5efa\u4f01\u4e1a\u81ea\u5efa\u5e94\u7528\u3011\uff0c\u586b\u5199\u5e94\u7528\u4fe1\u606f\u3002

\u70b9\u51fb\u3010\u6dfb\u52a0\u5e94\u7528\u80fd\u529b\u3011\uff0c\u9009\u62e9 \u3010\u6309\u80fd\u529b\u6dfb\u52a0-\u673a\u5668\u4eba\u3011\uff0c\u70b9\u51fb\u3010\u6dfb\u52a0\u3011

"},{"location":"user_manual/X-Pack/feishu_doc/#12","title":"1.2 \u6dfb\u52a0\u6743\u9650","text":"

\u6253\u5f00\u3010\u6743\u9650\u7ba1\u7406\u3011\uff0c\u590d\u5236\u4e0b\u9762\u7684\u6743\u9650\u914d\u7f6e\u5e76\u7c98\u8d34\u5230\u3010API\u6743\u9650-\u6743\u9650\u914d\u7f6e\u3011\u8f93\u5165\u6846\uff0c\u5168\u9009\u7b5b\u9009\u51fa\u6765\u7684\u6743\u9650\u9879\uff0c\u70b9\u51fb\u3010\u6279\u91cf\u5f00\u901a\u3011\uff0c\u6700\u540e\u70b9\u51fb\u3010\u786e\u8ba4\u3011\u3002

docs:document:export,docx:document:readonly,drive:drive,space:document:retrieve\n

"},{"location":"user_manual/X-Pack/feishu_doc/#13","title":"1.3 \u83b7\u53d6\u5fc5\u8981\u4fe1\u606f","text":"

\u83b7\u53d6APP ID\u3001APP Secret\u548c Folder Token\u3002 \u8fdb\u5165\u521b\u5efa\u597d\u7684\u98de\u4e66\u5e94\u7528\uff0c\u6253\u5f00\u3010\u51ed\u8bc1\u4e0e\u57fa\u7840\u4fe1\u606f\u3011\u9875\u9762\uff0c\u83b7\u53d6APP ID\u548cAPP Secret\u3002

"},{"location":"user_manual/X-Pack/feishu_doc/#14","title":"1.4 \u5e94\u7528\u53d1\u5e03","text":"

\u70b9\u51fb\u3010\u521b\u5efa\u7248\u672c\u3011\uff0c\u586b\u5199\u7248\u672c\u4fe1\u606f\u540e\uff0c\u70b9\u51fb\u3010\u4fdd\u5b58\u3011\uff0c\u5f85\u7ba1\u7406\u5458\u5ba1\u6838\u540e\u8fdb\u884c\u7fa4\u7ec4\u8bbe\u7f6e\u3002

"},{"location":"user_manual/X-Pack/feishu_doc/#15","title":"1.5 \u7fa4\u7ec4\u8bbe\u7f6e","text":"

\u5728\u5185\u90e8\u7fa4\u7ec4\u4e2d\u6dfb\u52a0\u5bf9\u5e94\u7684\u7fa4\u673a\u5668\u4eba\u3002

\u5728\u98de\u4e66\u6587\u6863\u7684\u6587\u4ef6\u5939\u4e2d\uff0c\u6dfb\u52a0\u5305\u542b\u5e94\u7528\u673a\u5668\u4eba\u7684\u7fa4\u7ec4\u4f5c\u4e3a\u534f\u4f5c\u8005\u3002

"},{"location":"user_manual/X-Pack/feishu_doc/#2","title":"2 \u521b\u5efa\u98de\u4e66\u6587\u6863\u77e5\u8bc6\u5e93","text":"

\u5728\u521b\u5efa\u77e5\u8bc6\u5e93\u65f6\uff0c\u77e5\u8bc6\u5e93\u7c7b\u578b\u9009\u62e9\u4e3a\u3010\u98de\u4e66\u3011\uff0c\u5e76\u914d\u7f6e\u76f8\u5e94\u53c2\u6570\uff1a

  • App ID\uff1a\u98de\u4e66\u5e94\u7528\u552f\u4e00\u6807\u8bc6\u3002
  • App Secret\uff1a\u98de\u4e66\u5e94\u7528\u51ed\u8bc1\u3002
  • Folder Token\uff1a\u662f\u98de\u4e66\u4e91\u7a7a\u95f4\u4e2d\u6bcf\u4e2a\u6587\u4ef6\u5939\u7684\u552f\u4e00\u6807\u8bc6\uff0c\u7528\u4e8e\u533a\u5206\u548c\u64cd\u4f5c\u7279\u5b9a\u7684\u6587\u4ef6\u5939\u98de\u4e66\u4e2d\u7684\u6587\u4ef6\u5939\u3002\u9009\u4e2d\u6587\u4ef6\u5939\uff0c\u5728\u94fe\u63a5\u4fe1\u606f\u4e2d\u5373\u53ef\u83b7\u53d6\u3002

\u5728\u98de\u4e66\u77e5\u8bc6\u5e93\u4e2d\uff0c\u70b9\u51fb\u3010\u5bfc\u5165\u6587\u6863\u3011\uff0c\u9009\u62e9\u98de\u4e66\u6587\u4ef6\u5939\u4e0b\u9762\u9700\u8981\u4e0a\u4f20\u7684\u6587\u6863\uff0c\u70b9\u51fb\u5f00\u59cb\u5bfc\u5165\uff0c\u5373\u53ef\u4ee5\u5c06\u98de\u4e66\u6587\u6863\u5bfc\u5165\u5230 MaxKB \u4e2d\u3002

"},{"location":"user_manual/X-Pack/login_auth/","title":"\u767b\u5f55\u8ba4\u8bc1","text":""},{"location":"user_manual/X-Pack/login_auth/#_2","title":"\u767b\u5f55\u8bbe\u7f6e","text":"

MaxKB \u652f\u6301\u5bf9\u9ed8\u8ba4\u767b\u5f55\u65b9\u5f0f\u548c\u8d26\u53f7\u767b\u5f55\u9a8c\u8bc1\u7801\u8fdb\u884c\u8bbe\u7f6e\u3002

\u9ed8\u8ba4\u767b\u5f55\u65b9\u5f0f\uff1a\u7ba1\u7406\u5458\u53ef\u4ee5\u6839\u636e\u4f01\u4e1a\u7edf\u4e00\u7684\u767b\u5f55\u7b56\u7565\uff0c\u9884\u5148\u8bbe\u7f6e\u7cfb\u7edf\u9ed8\u8ba4\u7684\u767b\u5f55\u9014\u5f84\uff0c\u4f8b\u5982\u8d26\u53f7\u5bc6\u7801\u767b\u5f55\u6216\u7b2c\u4e09\u65b9\u767b\u5f55\u3002

\u8d26\u53f7\u767b\u5f55\u9a8c\u8bc1\u7801\u8bbe\u7f6e\uff1a\u5f53\u7528\u6237\u8fde\u7eed\u767b\u5f55\u5931\u8d25\u6b21\u6570\u8fbe\u5230\u9884\u8bbe\u9608\u503c\u65f6\uff0c\u7cfb\u7edf\u4f1a\u81ea\u52a8\u89e6\u53d1\u9a8c\u8bc1\u7801\u6821\u9a8c\u673a\u5236\uff0c\u6709\u6548\u9632\u8303\u66b4\u529b\u7834\u89e3\u7b49\u5b89\u5168\u98ce\u9669\u3002

"},{"location":"user_manual/X-Pack/login_auth/#_3","title":"\u767b\u5f55\u8ba4\u8bc1","text":"

\u652f\u6301 LDAP\u3001CAS\u3001OIDC\u3001OAUTH2 \u5355\u70b9\u8ba4\u8bc1\u534f\u8bae\uff0c\u4ee5\u53ca\u4f01\u4e1a\u5fae\u4fe1\u3001\u9489\u9489\u3001\u98de\u4e66\u79fb\u52a8\u7aef\u626b\u7801\u767b\u5f55\u548c\u514d\u5bc6\uff0c\u6ee1\u8db3\u4f01\u4e1a\u5bf9\u4e8e\u5f3a\u8eab\u4efd\u9a8c\u8bc1\u548c\u8bbf\u95ee\u63a7\u5236\u7684\u9700\u6c42\u3002

"},{"location":"user_manual/X-Pack/login_auth/#1-ldap","title":"1 LDAP","text":"

\u914d\u7f6e LDAP \u7684\u8fc7\u7a0b\u53ef\u53c2\u8003\u4e0b\u56fe\uff0c\u6ce8\u610f\u52fe\u9009\u4e0b\u65b9\"\u542f\u7528 LDAP \u8ba4\u8bc1\"\u540e\u5f00\u542f\u6b64\u529f\u80fd\u3002 \u63d0\u793a\uff1a\u914d\u7f6e\u5b8c\u6210\u53ef\u70b9\u51fb\u4e0a\u65b9\u3010\u6d4b\u8bd5\u8fde\u63a5\u3011\u5373\u65f6\u6d4b\u8bd5\u914d\u7f6e\u4fe1\u606f\u662f\u5426\u6b63\u786e\uff0c\u7f51\u7edc\u662f\u5426\u8fde\u901a\u3002

"},{"location":"user_manual/X-Pack/login_auth/#2-cas","title":"2 CAS","text":"

\u914d\u7f6e CAS \u7684\u8fc7\u7a0b\u53ef\u53c2\u8003\u4e0b\u56fe\uff0c\u6ce8\u610f\u52fe\u9009\u4e0b\u65b9\"\u542f\u7528 CAS \u8ba4\u8bc1\"\u540e\u5f00\u542f\u6b64\u529f\u80fd\u3002 \u8bf4\u660e\uff1a CAS \u56de\u8c03\u5730\u5740\u5373 MaxKB \u8bbf\u95ee\u5730\u5740\u52a0\u4e0a /api/cas \uff0c\u4f8b\u5982\uff1ahttp://40.100.86.240:8080/admin/api/cas\u3002

"},{"location":"user_manual/X-Pack/login_auth/#3-oidc","title":"3 OIDC","text":"

\u914d\u7f6e OIDC \u7684\u8fc7\u7a0b\u53ef\u53c2\u8003\u4e0b\u56fe\uff0c\u6ce8\u610f\u52fe\u9009\u4e0b\u65b9\"\u542f\u7528 OIDC \u8ba4\u8bc1\"\u540e\u5f00\u542f\u6b64\u529f\u80fd\u3002 \u8bf4\u660e\uff1a OIDC \u56de\u8c03\u5730\u5740\u5373 MaxKB \u8bbf\u95ee\u5730\u5740\u52a0\u4e0a /api/oidc \uff0c\u4f8b\u5982\uff1ahttp://40.100.86.240:8080/admin/api/oidc\u3002

"},{"location":"user_manual/X-Pack/login_auth/#4-oauth2","title":"4 OAUTH2","text":"

\u914d\u7f6e OAUTH2 \u7684\u8fc7\u7a0b\u53ef\u53c2\u8003\u4e0b\u56fe\uff08\u6388\u6743\u7aef\u4ee5 github \u4e3a\u4f8b\uff09\uff0c\u6ce8\u610f\u52fe\u9009\u4e0b\u65b9\"\u542f\u7528 OAHTU2 \u8ba4\u8bc1\"\u540e\u5f00\u542f\u6b64\u529f\u80fd\u3002 \u8bf4\u660e\uff1a OAUTH2 \u56de\u8c03\u5730\u5740\u5373 MaxKB \u8bbf\u95ee\u5730\u5740\u52a0\u4e0a /api/oauth2 \uff0c\u4f8b\u5982\uff1ahttp://40.100.86.240:8080/admin/api/oauth2\u3002

"},{"location":"user_manual/X-Pack/login_auth/#5","title":"5 \u5e73\u53f0\u5bf9\u63a5","text":"

\u652f\u6301\u4f01\u4e1a\u5fae\u4fe1\u3001\u9489\u9489\u3001\u98de\u4e66\u63a5\u5165\uff0c\u652f\u6301\u626b\u7801\u767b\u5f55\u3001\u514d\u5bc6\u767b\u5f55\u3002

"},{"location":"user_manual/X-Pack/login_auth/#51","title":"5.1 \u4f01\u4e1a\u5fae\u4fe1\u5bf9\u63a5","text":""},{"location":"user_manual/X-Pack/login_auth/#511","title":"5.1.1 \u4f01\u4e1a\u5fae\u4fe1\u5bf9\u63a5\u8bbe\u7f6e","text":"

MaxKB \u5bf9\u63a5\u4f01\u4e1a\u5fae\u4fe1\uff0c\u9700\u8981\u586b\u5199\u4ee5\u4e0b\u4fe1\u606f\uff1a

  • Corp ID\uff1a\u4f01\u4e1aID\u3002\u4f01\u4e1a\u5fae\u4fe1\u7ba1\u7406\u5458\u5728\u7ba1\u7406\u540e\u53f0\u7684\u3010\u4f01\u4e1a\u4fe1\u606f\u3011\u4e2d\u83b7\u53d6\u3002
  • Agent ID\uff1a\u4f01\u4e1a\u5fae\u4fe1\u81ea\u5efa\u5e94\u7528\u552f\u4e00\u6807\u8bc6\uff0c\u4f01\u4e1a\u5fae\u4fe1\u7ba1\u7406\u5728\u7ba1\u7406\u540e\u53f0\u521b\u5efa\u6216\u67e5\u770b\u5e94\u7528\u65f6\u83b7\u53d6\u3002
  • App Secret\uff1a\u4f01\u4e1a\u5fae\u4fe1\u81ea\u5efa\u5e94\u7528\u7684\u5bc6\u94a5\u3002
  • \u56de\u8c03\u5730\u5740\uff1a\u5373 MaxKB \u8bbf\u95ee\u7684 URL\u3002

MaxKB \u914d\u7f6e\u4f01\u4e1a\u5fae\u4fe1\u626b\u7801\u767b\u5f55\u65f6\uff0c\u9700\u8981\u4f01\u4e1a\u5fae\u4fe1\u7ba1\u7406\u5458\u767b\u5f55 \u4f01\u4e1a\u5fae\u4fe1\u7ba1\u7406\u7ba1\u7406 \u5e76\u521b\u5efa\u4f01\u4e1a\u81ea\u5efa\u5e94\u7528\uff0c\u5b8c\u6210\u914d\u7f6e\u540e\u53d1\u5e03\u5e94\u7528\u3002

\u7b2c\u4e00\u6b65\uff1a\u521b\u5efa\u5e94\u7528\u3002\u5728\u3010\u5e94\u7528\u7ba1\u7406-\u5e94\u7528-\u81ea\u5efa\u3011\u4e2d\u70b9\u51fb\u3010\u521b\u5efa\u5e94\u7528\u3011\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u7b49\u4fe1\u606f\uff0c\u5e94\u7528\u521b\u5efa\u5b8c\u6210\u540e\u5373\u53ef\u67e5\u770b\u5e94\u7528 Agent ID\u548c Secret\u3002

\u7b2c\u4e8c\u6b65\uff1a\u8bbe\u7f6e\u53ef\u4fe1\u57df\u540d\u3002\u5728\u3010\u5f00\u53d1\u8005\u63a5\u53e3\u3011\u4e2d\u70b9\u51fb\u3010\u8bbe\u7f6e\u53ef\u4fe1\u57df\u540d\u3011\uff0c\u6dfb\u52a0\u53ef\u4fe1\u57df\u540d\uff0c\u5e76\u8fdb\u884c\u6821\u9a8c\u3002\u53ef\u53c2\u8003\u53ef\u4fe1\u57df\u540d\u914d\u7f6e\u3002

\u7b2c\u4e09\u6b65\uff1a\u6388\u6743\u56de\u8c03\u57df\u3002\u5728\u3010\u4f01\u4e1a\u5fae\u4fe1\u6388\u6743\u3011\u4e2d\u8bbe\u7f6e\u6388\u6743\u56de\u8c03\u57df\u3002

\u7b2c\u4e09\u6b65\uff1a\u914d\u7f6e\u4f01\u4e1a\u53ef\u4fe1IP\u3002\u5728\u3010\u4f01\u4e1a\u53ef\u4fe1IP\u3011\u4e2d\u914d\u7f6e\u53ef\u4fe1ip\u3002

\u5b8c\u6210\u4f01\u4e1a\u5fae\u4fe1\u5e94\u7528\u7684\u914d\u7f6e\u548c\u53d1\u5e03\u540e\uff0c\u5728 MaxKB \u4f01\u4e1a\u5fae\u4fe1\u767b\u5f55\u626b\u7801\u914d\u7f6e\u9875\u9762\u914d\u7f6e\u76f8\u5e94\u4fe1\u606f\u5e76\u901a\u8fc7\u6548\u9a8c\u3002

\u540e\u7eed\u5373\u53ef\u5728 MaxKB \u767b\u9646\u9875\u9762\u70b9\u51fb\u9009\u62e9\u4f01\u4e1a\u5fae\u4fe1\u8fdb\u884c\u626b\u7801\u767b\u9646\u3002

"},{"location":"user_manual/X-Pack/login_auth/#512","title":"5.1.2 \u4f01\u4e1a\u5fae\u4fe1\u514d\u767b\u8bbe\u7f6e","text":"

\u5e94\u7528\u4e3b\u9875\u5730\u5740\u7684\u6784\u9020\u53ef\u4ee5\u53c2\u8003\u4f01\u4e1a\u5fae\u4fe1\u5f00\u53d1\u6307\u5357\u9020\u7f51\u9875\u6388\u6743\u94fe\u63a5\u2014\u2014\u6784\u9020\u4f01\u4e1aoauth2\u94fe\u63a5\u3002 \u94fe\u63a5\u683c\u5f0f\u5373\u53c2\u6570\u8bf4\u660e\u5982\u4e0b\uff1a

  • \u94fe\u63a5\u683c\u5f0f\uff1ahttps://open.weixin.qq.com/connect/oauth2/authorize?redirect_uri=REDIRECT_URI/admin/api/wecom/oauth2&response_type=code&scope=snsapi_privateinfo&appid=CorpID&agentid=AgentID&state=maxkb#wechat_redirect
  • CORPID\uff1a \u4f01\u4e1a\u7684 CorpID
  • REDIRECT_URI\uff1a\u6388\u6743\u540e\u91cd\u5b9a\u5411\u7684\u56de\u8c03\u94fe\u63a5\u5730\u5740\uff0c\u9700\u8981\u4f7f\u7528 urlencode \u5bf9\u94fe\u63a5\u8fdb\u884c\u5904\u7406\uff0c\u4f8b\u5982\uff1ahttps%3A%2F%2Fmaxkbk.fit2cloud.cn\uff0c\u8c03\u6574\u57df\u540d\u90e8\u5206\u5373\u53ef\u3002
  • SCOPE\uff1a\u586b snsapi_privateinfo \u5373\u53ef
  • AGENTID\uff1a\u5e94\u7528 ID

\u4e3b\u9875\u5730\u5740\u793a\u4f8b\uff1ahttps://open.weixin.qq.com/connect/oauth2/authorize?redirect_uri=https%3A%2F%2Fmaxkbk.fit2cloud.cn/admin/api/wecom/oauth2&response_type=code&scope=snsapi_privateinfo&appid=ww5fad05aaa36d118c&agentid=1000002&state=maxkb#wechat_redirect

\u914d\u7f6e\u5b8c\u6210\u540e\uff0c\u5728\u4f01\u4e1a\u5fae\u4fe1\u5de5\u4f5c\u53f0\u4e2d\u627e\u5230 MaxKB \u5e94\u7528\uff0c\u514d\u767b\u8bbf\u95ee MaxKB\u3002

"},{"location":"user_manual/X-Pack/login_auth/#52","title":"5.2 \u9489\u9489\u5bf9\u63a5","text":""},{"location":"user_manual/X-Pack/login_auth/#521","title":"5.2.1 \u9489\u9489\u5bf9\u63a5\u8bbe\u7f6e","text":"

MaxKB \u5bf9\u63a5\u9489\u9489\uff0c\u9700\u8981\u586b\u5199\u4ee5\u4e0b\u4fe1\u606f\uff1a

  • Corp ID\uff1a\u9489\u9489\u7ec4\u7ec7\u6807\u8bc6\uff0c\u5728\u9489\u9489\u5f00\u653e\u5e73\u53f0\u4e2d\u53f3\u4e0a\u65b9\u7ec4\u7ec7\u4fe1\u606f\u4e2d\u67e5\u770b\u3002
  • APP Key\uff1a\u9489\u9489\u5e94\u7528\u6807\u8bc6\uff0c\u5728\u9489\u9489\u5f00\u653e\u5e73\u53f0\u4e2d\u67e5\u770b\u5e94\u7528\u3010\u51ed\u8bc1\u4e0e\u57fa\u7840\u4fe1\u606f\u3011\u4e2d\u67e5\u770b\u3002
  • App Secret\uff1a\u9489\u9489\u5e94\u7528\u79d8\u94a5\uff0c\u5728\u9489\u9489\u5f00\u653e\u5e73\u53f0\u4e2d\u67e5\u770b\u5e94\u7528\u3010\u51ed\u8bc1\u4e0e\u57fa\u7840\u4fe1\u606f\u3011\u4e2d\u67e5\u770b\u3002
  • \u56de\u8c03\u5730\u5740\uff1a\u5373 MaxKB \u8bbf\u95eeURL\u3002

MaxKB \u914d\u7f6e\u9489\u9489\u626b\u7801\u767b\u5f55\u65f6\uff0c\u9700\u8981\u5728 \u9489\u9489\u5f00\u653e\u5e73\u53f0 \u521b\u5efa\u5e94\u7528\u5e76\u8fdb\u884c\u914d\u7f6e\u3002

\u7b2c\u4e00\u6b65\uff1a\u521b\u5efa\u5e94\u7528\u3002\u5728\u3010\u5e94\u7528\u5f00\u53d1-\u9489\u9489\u5e94\u7528\u3011\u4e2d\u70b9\u51fb\u3010\u521b\u5efa\u5e94\u7528\u3011\uff0c\u5e94\u7528\u521b\u5efa\u5b8c\u540e\u5728\u3010\u51ed\u8bc1\u4e0e\u57fa\u7840\u4fe1\u606f\u3011\u53ef\u67e5\u6848 APPKey \u548c APPSecret \u4fe1\u606f\u3002

\u7b2c\u4e8c\u6b65\uff1a\u8fdb\u5165\u5230\u3010\u6743\u9650\u7ba1\u7406\u3011\u4e2d\uff0c\u6dfb\u52a0\u5982\u4e0b\u56fe\u6240\u793a\u7684\u6743\u9650\u5373\u53ef\u3002

\u7b2c\u4e09\u6b65\uff1a\u5728\u3010\u7248\u672c\u7ba1\u7406\u4e0e\u53d1\u5e03\u3011\u4e2d\uff0c\u586b\u5199\u5e94\u7528\u7248\u672c\u53f7\u3001\u7248\u672c\u63cf\u8ff0\u7b49\u4fe1\u606f\uff0c\u70b9\u51fb\u3010\u4fdd\u6301\u3011\uff0c\u53d1\u5e03\u5e94\u7528\u3002

\u5b8c\u6210\u914d\u7f6e\u540e\u53d1\u5e03\uff0c\u7136\u540e\u5728 MaxKB \u9489\u9489\u626b\u7801\u767b\u5f55\u626b\u7801\u914d\u7f6e\u9875\u9762\u8fdb\u884c\u914d\u7f6e\u5e76\u4fdd\u5b58\u3002

\u540e\u7eed\u5373\u53ef\u5728 MaxKB \u767b\u9646\u9875\u9762\u70b9\u51fb\u9009\u62e9\u9489\u9489\u8fdb\u884c\u626b\u7801\u767b\u9646\u3002

"},{"location":"user_manual/X-Pack/login_auth/#522","title":"5.2.2 \u9489\u9489\u514d\u767b\u8bbe\u7f6e","text":"

\u6dfb\u52a0\u7f51\u9875\u5e94\u7528\u80fd\u529b\u3002\u5728\u9489\u9489\u5f00\u653e\u5e73\u53f0\u7684\u3010\u5e94\u7528\u80fd\u529b\u3011\u4e2d\uff0c\u6dfb\u52a0\u3010\u7f51\u9875\u5e94\u7528\u3011\u3002

\u8bbe\u7f6e\u3010\u5e94\u7528\u9996\u9875\u3011\u548c\u3010PC \u7aef\u9996\u9875\u5730\u5740\u3011\u3002

\u5730\u5740\u683c\u5f0f\u4e3a\uff1ahttp(s)://xxx.xxx.xxx/admin/login?client=dingtalk=CORPID\u3002\u6ce8\u610f corpId=CORPID \u9700\u66ff\u6362\u6210\u771f\u6b63\u7684 CORPID\u3002

\u5b89\u5168\u8bbe\u7f6e\u3002\u5728\u3010\u5b89\u5168\u8bbe\u7f6e\u3011\u4e2d\u8bbe\u7f6e\u91cd\u5b9a\u5411 URL \u548c\u7aef\u5185\u514d\u767b\u5f55\u5730\u5740\u3002

\u5206\u4eab\u8bbe\u7f6e\uff0c\u5728\u3010\u63a5\u5165\u767b\u5f55\u3011\u4e2d\u8bbe\u7f6e\u3010\u56de\u8c03\u57df\u540d\u3011\u3002

\u5e94\u7528\u53d1\u5e03\u540e\uff0c\u5373\u53ef\u5728\u9489\u9489\u5de5\u4f5c\u53f0\u514d\u767b\u5f55\u8bbf\u95ee MaxKB\u3002

"},{"location":"user_manual/X-Pack/login_auth/#53","title":"5.3 \u98de\u4e66\u5bf9\u63a5","text":""},{"location":"user_manual/X-Pack/login_auth/#531","title":"5.3.1 \u98de\u4e66\u5bf9\u63a5\u8bbe\u7f6e","text":"

MaxKB \u5bf9\u63a5\u98de\u4e66\uff0c\u9700\u8981\u586b\u5199\u4ee5\u4e0b\u4fe1\u606f\uff1a

  • APP Key\uff1b
  • Corp ID\uff1b
  • App Secret\uff1aMaxKB \u63d0\u4f9b\u7684\u56de\u8c03\u5730\u5740\uff0c\u5e76\u4f5c\u4e3a\u98de\u4e66\u514d\u767b\u5f55\u6388\u6743\u7684\u8df3\u8f6c\u5730\u5740\uff1b
  • \u56de\u8c03\u5730\u5740\uff1a\u5373 MaxKB URL \u5730\u5740 + '/api/feishu'\uff0c\u4f8b\u5982\uff1ahttp://xx.xxx.xx.xxx/api/feishu \u3002

MaxKB \u914d\u7f6e\u98de\u4e66\u626b\u7801\u767b\u5f55\u65f6\uff0c\u9700\u8981\u5728 \u98de\u4e66\u5f00\u653e\u5e73\u53f0 \u521b\u5efa\u4f01\u4e1a\u81ea\u5efa\u5e94\u7528\uff0c\u5b8c\u6210\u914d\u7f6e\u540e\u53d1\u5e03\uff0c\u7136\u540e\u5728 MaxKB \u98de\u4e66\u626b\u7801\u767b\u5f55\u626b\u7801\u914d\u7f6e\u9875\u9762\u8fdb\u884c\u914d\u7f6e\u5e76\u4fdd\u5b58\u3002

\u7b2c\u4e00\u6b65\uff1a\u521b\u5efa\u4f01\u4e1a\u81ea\u5efa\u5e94\u7528\u3002\u70b9\u51fb\u3010\u521b\u5efa\u4f01\u4e1a\u81ea\u5efa\u5e94\u7528\u3011\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u3001\u63cf\u8ff0\u4ee5\u53ca\u4e0a\u4f20\u5e94\u7528\u56fe\u6807\u540e\uff0c\u70b9\u51fb\u3010\u521b\u5efa\u3011\u3002

\u7b2c\u4e8c\u6b65\uff1a\u914d\u7f6e\u91cd\u5b9a\u5411 URL\u3002\u5728\u3010\u5f00\u53d1\u914d\u7f6e-\u5b89\u5168\u8bbe\u7f6e\u3011\u4e2d\uff0c\u8f93 \u5165MaxKB \u98de\u4e66\u626b\u7801\u914d\u7f6e\u5f39\u51fa\u6846\u4e2d\u7684\u56de\u8c03\u5730\u5740\uff0c\u70b9\u51fb\u3010\u6dfb\u52a0\u3011\u3002

\u7b2c\u4e09\u6b65\uff1a\u53d1\u5e03\u5e94\u7528\u3002\u5728\u3010\u7248\u672c\u7ba1\u7406\u4e0e\u53d1\u5e03\u3011\u4e2d\uff0c\u8f93\u5165\u5e94\u7528\u7248\u672c\u53f7\u3001\u66f4\u65b0\u8bf4\u660e\u7b49\u4fe1\u606f\uff0c\u70b9\u51fb\u3010\u4fdd\u5b58\u3011\uff0c\u5b8c\u6210\u5e94\u7528\u53d1\u5e03\u3002

\u53d1\u5e03\u5e94\u7528\u540e\uff0c\u5373\u53ef\u5728 MaxKB \u767b\u9646\u9875\u9762\u70b9\u51fb\u9009\u62e9\u98de\u4e66\u8fdb\u884c\u626b\u7801\u767b\u9646\u3002

"},{"location":"user_manual/X-Pack/login_auth/#532","title":"5.3.2 \u98de\u4e66\u514d\u767b\u8bbe\u7f6e","text":"

\u6dfb\u52a0\u3010\u9875\u9762\u5e94\u7528\u3011\u80fd\u529b\u3002

\u914d\u7f6e\u684c\u9762\u4e3b\u9875\uff0c\u4f8b\u5982\uff1a\u914d\u7f6e\u4e2d\u586b\u5199 \u684c\u9762\u7aef\u4e3b\u9875\u5730\u5740\uff0c\u5982\uff1ahttp(s)://xxx.xxx.xxx/admin/login?client=lark&appId=cli_a7e1c1ddexxxxx\u3002

\u5728\u3010\u5b89\u5168\u8bbe\u7f6e\u3011\u4e2d\u6dfb\u52a0\u91cd\u5b9a\u5411 URL\u3002

\u5e94\u7528\u53d1\u5e03\u540e\uff0c\u5373\u53ef\u5728\u98de\u4e66\u5de5\u4f5c\u53f0\u514d\u767b\u5f55\u8bbf\u95ee MaxKB\u3002

"},{"location":"user_manual/X-Pack/operation_log/","title":"\u7cfb\u7edf\u65e5\u5fd7","text":"

MaxKB \u7cfb\u7edf\u7ba1\u7406\u5458\u5728\u3010\u7cfb\u7edf\u8bbe\u7f6e-\u64cd\u4f5c\u65e5\u5fd7\u3011\u4e2d\u53ef\u67e5\u770b\u6240\u6709\u7528\u6237\u5bf9\u77e5\u8bc6\u5e93\u3001\u6a21\u578b\u3001\u5e94\u7528\u7b49\u64cd\u4f5c\uff0c\u65b9\u4fbf\u5ba1\u8ba1\u548c\u56de\u6eaf\u3002

  • \u652f\u6301\u7b5b\u9009\u4e0d\u540c\u65f6\u95f4\u6bb5\u6216\u8005\u81ea\u5b9a\u4e49\u65f6\u95f4\u8303\u56f4\u7684\u64cd\u4f5c\u65e5\u5fd7\u3002

  • \u652f\u6301\u6309\u7528\u6237\u3001\u72b6\u6001\u3001IP \u5730\u5740\u7b49\u65b9\u5f0f\u8fdb\u884c\u641c\u7d22\u3002

"},{"location":"user_manual/X-Pack/resource_management/","title":"\u8d44\u6e90\u7ba1\u7406","text":"

\u8d44\u6e90\u7ba1\u7406\u529f\u80fd\u4e3a\u7cfb\u7edf\u7ba1\u7406\u5458\u63d0\u4f9b\u7edf\u4e00\u3001\u9ad8\u6548\u7684\u8d44\u6e90\u53ef\u89c6\u5316\u7ba1\u7406\u80fd\u529b\u3002\u7cfb\u7edf\u7ba1\u7406\u5458\u53ef\u4ee5\u96c6\u4e2d\u67e5\u770b\u3001\u7ba1\u7406\u548c\u7ef4\u62a4\u6240\u6709\u5de5\u4f5c\u7a7a\u95f4\u4e0b\u7684\u6838\u5fc3\u8d44\u6e90\uff0c\u5305\u62ec \u5e94\u7528\u3001\u77e5\u8bc6\u5e93\u3001\u5de5\u5177\u3001\u6a21\u578b\u7b49\u3002

"},{"location":"user_manual/X-Pack/resource_management/#1","title":"1 \u8d44\u6e90\u67e5\u770b","text":"

\u652f\u6301\u67e5\u770b\u5404\u79cd\u5de5\u4f5c\u7a7a\u95f4\u5bf9\u77e5\u8bc6\u5e93\u3001\u5e94\u7528\u3001\u6a21\u578b\u3001\u5de5\u5177\u8d44\u6e90\uff1a

  • \u5e94\u7528\u5217\u8868\uff1a\u663e\u793a\u540d\u79f0\u3001\u7c7b\u578b\u3001\u72b6\u6001\u3001\u5de5\u4f5c\u7a7a\u95f4\u3001\u521b\u5efa\u8005\u3001\u6700\u8fd1\u53d1\u5e03\u65f6\u95f4\u3001\u521b\u5efa\u65f6\u95f4\u3002
  • \u67e5\u8be2\u652f\u6301\uff1a\u652f\u6301\u6309\u521b\u5efa\u8005\u3001\u540d\u79f0\u3001\u7c7b\u578b\u3001\u72b6\u6001\u3001\u5de5\u4f5c\u7a7a\u95f4\u67e5\u8be2\u3002

\u652f\u6301\u5173\u952e\u8bcd\u641c\u7d22\u548c\u5b57\u6bb5\u7b5b\u9009\uff0c\u5feb\u901f\u5b9a\u4f4d\u8d44\u6e90\u3002

"},{"location":"user_manual/X-Pack/resource_management/#2","title":"2 \u8d44\u6e90\u64cd\u4f5c","text":"

\u7ba1\u7406\u5458\u53ef\u5bf9\u4e0d\u540c\u7c7b\u578b\u8d44\u6e90\u6267\u884c\u7279\u5b9a\u64cd\u4f5c\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\uff1a

  • \u5e94\u7528\uff1a\u5bf9\u8bdd\u3001\u7ba1\u7406\u3001\u5bfc\u51fa\u3001\u5220\u9664\u3001\u8df3\u8f6c\u67e5\u770b\u7b49\uff1b
  • \u77e5\u8bc6\u5e93\uff1a\u652f\u6301\u7ba1\u7406\u3001\u5411\u91cf\u5316\u3001\u540c\u6b65\u3001\u751f\u6210\u95ee\u9898\u3001\u5bfc\u51fa\u4e3a Excel \u6216 ZIP\u3001\u914d\u7f6e\u8bbe\u7f6e\u3001\u5220\u9664\u7b49\uff1b
  • \u5de5\u5177\uff1a\u652f\u6301\u53c2\u6570\u914d\u7f6e\u3001\u542f\u7528/\u505c\u7528\u3001\u5bfc\u51fa\u7b49\uff1b
  • \u6a21\u578b\uff1a\u652f\u6301\u4fee\u6539\u3001\u6a21\u578b\u53c2\u6570\u914d\u7f6e\u3001\u5220\u9664\u7b49\uff1b

"},{"location":"user_manual/X-Pack/role/","title":"\u89d2\u8272\u7ba1\u7406","text":"

\u89d2\u8272\u662f\u7528\u6237\u5728\u7cfb\u7edf\u4e2d\u7684\u8eab\u4efd\uff0c\u7528\u4e8e\u6279\u91cf\u8fdb\u884c\u6743\u9650\u7ba1\u7406\u3002

\u7cfb\u7edf\u5185\u7f6e\u89d2\u8272\uff1a

  • \u7cfb\u7edf\u7ba1\u7406\u5458\uff1a\u6240\u6709\u7cfb\u7edf\u7ba1\u7406\u4e2d\u529f\u80fd\u7684\u6743\u9650\u8bbe\u7f6e\u4ee5\u53ca\u7528\u6237\u4fe1\u606f\u4e2d\u83dc\u5355\u6743\u9650\u3002
    • \u53ef\u4ee5\u67e5\u770b\u6240\u6709\u89d2\u8272\uff08\u5185\u7f6e\u89d2\u8272\u548c\u81ea\u5b9a\u4e49\u89d2\u8272\uff09\u7684\u6743\u9650\u914d\u7f6e\u3002
    • \u53ef\u4ee5\u64cd\u4f5c\u6240\u6709\u529f\u80fd\uff0c\u5982\u521b\u5efa\u6216\u4fee\u6539\u81ea\u5b9a\u4e49\u89d2\u8272\u914d\u7f6e\u3001\u6dfb\u52a0\u548c\u79fb\u9664\u6210\u5458\u3002
  • \u5de5\u4f5c\u7a7a\u95f4\u7ba1\u7406\u5458\uff1a\u62e5\u6709\u7cfb\u7edf\u7ba1\u7406\u5de5\u4f5c\u7a7a\u95f4\u7ba1\u7406\u6743\u9650\uff1b\u5e94\u7528\u3001\u77e5\u8bc6\u5e93\u3001\u5de5\u5177\u3001\u6a21\u578b\u6240\u6709\u529f\u80fd\u6743\u9650\u3002
    • \u53ef\u4ee5\u67e5\u770b\u666e\u901a\u7528\u6237\u89d2\u8272\u548c\u81ea\u5b9a\u4e49\u666e\u901a\u7528\u6237\u89d2\u8272\u7684\u6743\u9650\u914d\u7f6e\uff0c\u4e0d\u80fd\u8fdb\u884c\u6743\u9650\u7f16\u8f91\u3002
  • \u666e\u901a\u7528\u6237\uff1a\u53ef\u4ee5\u7ef4\u62a4\u81ea\u5df1\u521b\u5efa\u7684\u8d44\u6e90\u548c\u88ab\u6388\u6743\u7684\u8d44\u6e90\uff0c\u5982\u521b\u5efa\u7684\u5e94\u7528\u3001\u77e5\u8bc6\u5e93\u3001\u5de5\u5177\u3001\u6a21\u578b\u6240\u6709\u529f\u80fd\u6743\u9650\u3002

\u6ce8\u610f\uff1a\u7cfb\u7edf\u5185\u7f6e\u89d2\u8272\u4e0d\u53ef\u4ee5\u7f16\u8f91\u6743\u9650\uff0c\u4ec5\u80fd\u6dfb\u52a0/\u79fb\u9664\u6210\u5458\u3002

"},{"location":"user_manual/X-Pack/role/#1","title":"1 \u521b\u5efa\u89d2\u8272","text":"

\u521b\u5efa\u81ea\u5b9a\u4e49\u89d2\u8272\uff1a

  • \u89d2\u8272\u540d\u79f0\uff1a1-64 \u4e2a\u5b57\u7b26\u3002
  • \u7ee7\u627f\u89d2\u8272\uff1a\u7cfb\u7edf\u7ba1\u7406\u5458\u3001\u5de5\u4f5c\u7a7a\u95f4\u7ba1\u7406\u5458\u548c\u666e\u901a\u7528\u6237\u3002

\u6ce8\u610f\uff1a\u7cfb\u7edf\u7ba1\u7406\u5458\u529f\u80fd\uff0c\u5de5\u4f5c\u7a7a\u95f4\u7ba1\u7406\u5458\u65e0\u6b64\u529f\u80fd\u3002

"},{"location":"user_manual/X-Pack/role/#2","title":"2 \u6743\u9650\u914d\u7f6e","text":"

\u81ea\u5b9a\u4e49\u89d2\u8272\u521b\u5efa\u6210\u529f\uff0c\u9ed8\u8ba4\u4e0d\u52fe\u9009\u7ee7\u627f\u89d2\u8272\u7684\u6240\u6709\u6743\u9650\u3002\u81ea\u5b9a\u4e49\u89d2\u8272\u53ef\u7ee7\u627f\u5185\u7f6e\u7684 3 \u79cd\u89d2\u8272\u8fdb\u884c\u81ea\u5b9a\u4e49\u6743\u9650\uff0c\u5982\u81ea\u5b9a\u4e49\u7cfb\u7edf\u7ba1\u7406\u5458\u7684\u6743\u9650\u8bbe\u7f6e\uff0c\u53ef\u4ee5\u5728\u5185\u7f6e\u7cfb\u7edf\u7ba1\u7406\u5458\u7684\u6743\u9650\u8303\u56f4\u5185\u7f16\u8f91\u3002

\u5185\u7f6e\u7cfb\u7edf\u7ba1\u7406\u5458\u89d2\u8272\u6743\u9650\uff1a

\u5185\u7f6e\u5de5\u4f5c\u7a7a\u95f4\u7ba1\u7406\u5458\u89d2\u8272\u6743\u9650\uff1a

\u5185\u7f6e\u7cfb\u666e\u901a\u7528\u6237\u89d2\u8272\u6743\u9650\uff1a

"},{"location":"user_manual/X-Pack/role/#3","title":"3 \u6210\u5458\u7ba1\u7406","text":"

\u652f\u6301\u6309\u89d2\u8272\u7ba1\u7406\u6210\u5458\uff0c\u70b9\u51fb\u3010\u6210\u5458\u3011\uff0c\u663e\u793a\u5f53\u524d\u6240\u9009\u89d2\u8272\u7684\u6210\u5458\u5217\u8868\u3002

\u5de5\u4f5c\u7a7a\u95f4\u7ba1\u7406\u5458\u53ef\u4ee5\u770b\u5230\u4f5c\u4e3a\u5de5\u4f5c\u7a7a\u95f4\u7ba1\u7406\u5458\u89d2\u8272\u7684\u5de5\u4f5c\u7a7a\u95f4\u4e0b\u7684\u6240\u6709\u6210\u5458\u3002

\u6dfb\u52a0\u6210\u5458\uff1a

  • \u4e3a\u5f53\u524d\u89d2\u8272\u6dfb\u52a0\u6210\u5458\uff0c\u6210\u5458\u4e0b\u62c9\u5217\u8868\u53ef\u4ee5\u591a\u9009\u3002
  • \u5f53\u524d\u6240\u9009\u7684\u89d2\u8272\u4e3a\u5de5\u4f5c\u7a7a\u95f4\u7ba1\u7406\u5458\u6216\u666e\u901a\u7528\u6237\u89d2\u8272\u65f6\uff0c\u6dfb\u52a0\u6210\u5458\u65f6\u9009\u62e9\u5b8c\u6210\u540e\uff0c\u8fd8\u9700\u8981\u9009\u62e9\u5de5\u4f5c\u7a7a\u95f4\uff0c\u5de5\u4f5c\u7a7a\u95f4\u5217\u8868\u4e5f\u53ef\u4ee5\u591a\u9009\u3002

\u6ce8\u610f\uff1a\u5de5\u4f5c\u7a7a\u95f4\u7ba1\u7406\u5458\u6dfb\u52a0\u6210\u5458\u65f6\uff0c\u5de5\u4f5c\u7a7a\u95f4\u4e0b\u62c9\u5217\u8868\u4ec5\u5217\u51fa\u5de5\u4f5c\u7a7a\u95f4\u7ba1\u7406\u5458\u89d2\u8272\u7684\u5de5\u4f5c\u7a7a\u95f4\u3002

\u79fb\u9664\u6210\u5458\uff1a

  • \u7528\u6237\u5728\u67d0\u4e2a\u5de5\u4f5c\u7a7a\u95f4\u4e2d\u7684\u89d2\u8272\uff0c\u82e5\u7528\u6237\u62e5\u6709\u591a\u5de5\u4f5c\u7a7a\u95f4\u7684\u6210\u5458\uff0c\u9700\u8981\u79fb\u9664\u591a\u6b21\u3002
  • \u6210\u5458\u79fb\u9664\u540e\uff0c\u767b\u5f55\u7cfb\u7edf\u5219\u4e0d\u518d\u62e5\u6709\u8be5\u89d2\u8272\u3002
  • \u5185\u7f6e\u7cfb\u7edf\u7ba1\u7406\u5458\u89d2\u8272\u4e2d\u7684 admin \u7528\u6237\u4e0d\u80fd\u88ab\u79fb\u9664\u3002
"},{"location":"user_manual/X-Pack/shared_resources/","title":"\u5171\u4eab\u8d44\u6e90","text":""},{"location":"user_manual/X-Pack/shared_resources/#1","title":"1 \u6982\u8ff0","text":"

\u4f01\u4e1a\u7248\u652f\u6301\u7cfb\u7edf\u7ba1\u7406\u5458\u521b\u5efa\u5171\u4eab\u8d44\u6e90\uff08\u77e5\u8bc6\u5e93\u3001\u5de5\u5177\u3001\u6a21\u578b\uff09\uff0c\u53ef\u6388\u6743\u7ed9\u6307\u5b9a\u5de5\u4f5c\u7a7a\u95f4\u67e5\u770b\u548c\u4f7f\u7528\u3002

\u6ce8\u610f\uff1a\u88ab\u6388\u6743\u7684\u5de5\u4f5c\u7a7a\u95f4\u53ef\u4ee5\u770b\u5230\u5171\u4eab\u8d44\u6e90\uff0c\u4f46\u4ec5\u80fd\u67e5\u770b\u548c\u4f7f\u7528\uff0c\u4e0d\u80fd\u7f16\u8f91\u548c\u5220\u9664\u3002

\u521b\u5efa\u8d44\u6e90\u540e\u6388\u6743\u5de5\u4f5c\u7a7a\u95f4:

  • \u9009\u62e9\u767d\u540d\u5355\uff1a\u5141\u8bb8\u5df2\u9009\u62e9\u7684\u5de5\u4f5c\u7a7a\u95f4\u4f7f\u7528\u8be5\u5171\u4eab\u8d44\u6e90\u3002
  • \u9009\u62e9\u9ed1\u540d\u5355\uff1a\u9664\u4e86\u5df2\u9009\u62e9\u7684\u5de5\u4f5c\u7a7a\u95f4\uff0c\u5176\u4ed6\u6240\u6709\u5de5\u4f5c\u7a7a\u95f4\u90fd\u53ef\u4ee5\u4f7f\u7528\u8be5\u5171\u4eab\u8d44\u6e90\u3002

\u9ed8\u8ba4\u9009\u62e9\u767d\u540d\u5355\uff0c\u6388\u6743\u5de5\u4f5c\u7a7a\u95f4\u4e3a\u7a7a\uff0c\u5219\u6240\u6709\u5de5\u4f5c\u7a7a\u95f4\u90fd\u4e0d\u80fd\u770b\u5230\u8fd9\u4e2a\u8d44\u6e90\u3002\u82e5\u7528\u6237\u4fee\u6539\u6388\u6743\u7c7b\u578b\u4e3a\u9ed1\u540d\u5355\uff0c\u6388\u6743\u5de5\u4f5c\u7a7a\u95f4\u4e3a\u7a7a\uff0c\u5219\u6240\u6709\u5de5\u4f5c\u7a7a\u95f4\u90fd\u80fd\u67e5\u770b\u8fd9\u4e2a\u8d44\u6e90\u3002

"},{"location":"user_manual/X-Pack/shared_resources/#2","title":"2 \u77e5\u8bc6\u5e93","text":"

\u521b\u5efa\u5171\u4eab\u77e5\u8bc6\u5e93\u64cd\u4f5c\u4e0e\u5de5\u4f5c\u7a7a\u95f4\u4e2d\u521b\u5efa\u77e5\u8bc6\u5e93\u754c\u9762\u529f\u80fd\u76f8\u540c\uff0c\u5207\u6362\u5171\u4eab\u77e5\u8bc6\u5e93\u5217\u8868\u663e\u793a\u6240\u6709\u7684\u5171\u4eab\u77e5\u8bc6\u5e93\u540d\u79f0\u3002 \u6ce8\u610f\uff1a\u5411\u91cf\u6a21\u578b\u4ec5\u53ef\u4ee5\u9009\u62e9\u5171\u4eab\u6a21\u578b\u7684\u5411\u91cf\u6a21\u578b\u3002

\u6388\u6743\u5de5\u4f5c\u7a7a\u95f4\u53ef\u4ee5\u67e5\u770b\u548c\u4f7f\u7528\u5171\u4eab\u77e5\u8bc6\u5e93\u3002

\u5171\u4eab\u77e5\u8bc6\u5e93\u5728\u6587\u6863\u3001\u95ee\u9898\u3001\u547d\u4e2d\u6d4b\u8bd5\u3001\u5bf9\u8bdd\u4ee5\u53ca\u8bbe\u7f6e\u7684\u754c\u9762\u53ca\u529f\u80fd\uff0c\u4e0e\u5728\u5de5\u4f5c\u7a7a\u95f4\u521b\u5efa\u7684\u77e5\u8bc6\u5e93\u4e00\u81f4\u3002

"},{"location":"user_manual/X-Pack/shared_resources/#3","title":"3 \u5de5\u5177","text":"

\u521b\u5efa\u5171\u4eab\u5de5\u5177\u64cd\u4f5c\u4e0e\u5de5\u4f5c\u7a7a\u95f4\u4e2d\u521b\u5efa\u5de5\u5177\u529f\u80fd\u76f8\u540c\uff0c\u5207\u6362\u5171\u4eab\u5de5\u5177\u5217\u8868\u663e\u793a\u5168\u90e8\u7684\u5171\u4eab\u5de5\u5177\uff0c\u4e5f\u53ef\u5355\u72ec\u9009\u62e9\u5de5\u5177\u548c MCP \u8fdb\u884c\u521b\u5efa\u3002

\u6388\u6743\u5de5\u4f5c\u7a7a\u95f4\u53ef\u4ee5\u67e5\u770b\u548c\u4f7f\u7528\u5171\u4eab\u5de5\u5177\u3002

"},{"location":"user_manual/X-Pack/shared_resources/#4","title":"4 \u6a21\u578b","text":"

\u521b\u5efa\u5171\u4eab\u6a21\u578b\u64cd\u4f5c\u4e0e\u5de5\u4f5c\u7a7a\u95f4\u4e2d\u521b\u5efa\u6a21\u578b\u529f\u80fd\u76f8\u540c\uff0c\u5207\u6362\u5171\u4eab\u6a21\u578b\u5217\u8868\u663e\u793a\u6240\u6709\u7684\u5171\u4eab\u6a21\u578b\u540d\u79f0\u3002

\u6388\u6743\u5de5\u4f5c\u7a7a\u95f4\u53ef\u4ee5\u67e5\u770b\u548c\u4f7f\u7528\u5171\u4eab\u6a21\u578b\u3002

"},{"location":"user_manual/X-Pack/system_API/","title":"\u7cfb\u7edf API","text":""},{"location":"user_manual/X-Pack/system_API/#1-api-key","title":"1 API Key \u7ba1\u7406","text":"

\u5728\u9875\u9762\u53f3\u4e0a\u65b9\u767b\u9646\u7528\u6237\u56fe\u6807\u4e0b\u62c9\u83dc\u5355\u4e2d\uff0c\u70b9\u51fb\u3010API Key \u7ba1\u7406\u3011\u83dc\u5355\uff0c\u8fdb\u5165 API Key \u7ba1\u7406\u7a97\u53e3\uff0c\u53ef\u4ee5\u521b\u5efa\u3001\u542f\u7528/\u5173\u95ed\u3001\u5220\u9664\u3001\u8bbe\u7f6e API Key \u7b49\u64cd\u4f5c\u3002

\u521b\u5efa API Key \u4e4b\u540e\uff0c\u70b9\u51fb\u3010\u8bbe\u7f6e\u3011\u4e0b\u65b9\u53ef\u4ee5\u914d\u7f6e\u662f\u5426\u5141\u8bb8\u8de8\u57df\u5730\u5740\uff0c\u9ed8\u8ba4\u4e0d\u5141\u8bb8\u3002

"},{"location":"user_manual/X-Pack/system_API/#2-api","title":"2 API \u8c03\u8bd5","text":"

\u6253\u5f00 API \u6587\u6863\u5730\u5740\u540e\uff0c\u8f93\u5165 API Key \u8fdb\u884c\u6388\u6743\uff0c\u5373\u53ef\u8fdb\u884c API \u5728\u7ebf\u8c03\u8bd5\u3002

\u6ce8\u610f\uff1a\u5f53\u4f7f\u7528\u7684\u63a5\u53e3\u6d89\u53ca\u5e94\u7528\u5bf9\u8bdd\u65f6\uff0cAuthorize \u9700\u586b\u5199\u5e94\u7528\u7684 API Key\uff08application-0d5722xxxxxxxxx\uff09\uff0c\u5426\u5219\u4f1a\u51fa\u73b0\u5982\u4e0b\u62a5\u9519\uff1a

"},{"location":"user_manual/X-Pack/system_API/#3-api","title":"3 \u5f00\u542f\u8eab\u4efd\u9a8c\u8bc1\u7684 API \u8c03\u7528","text":"

\u5f00\u542f\u8eab\u4efd\u9a8c\u8bc1\u540e\u7684 API \u8c03\u7528\u4f7f\u7528\u7684 Authorize \u4e0e\u901a\u8fc7 API Key \u8fdb\u884c\u5bf9\u8bdd\u7684\u83b7\u53d6\u65b9\u5f0f\u6709\u6240\u4e0d\u540c\uff0c\u4ee5\u8d26\u53f7\u767b\u5f55\u4e3a\u4f8b\u3002

"},{"location":"user_manual/X-Pack/system_API/#31-api","title":"3.1 \u767b\u5f55 API \u5730\u5740","text":"

\u70b9\u51fb\u7528\u6237\u5934\u50cf\uff0c\u9009\u62e9\u3010API Key \u7ba1\u7406\u3011\u3002

\u521b\u5efa API Key\uff0c\u590d\u5236\u5e76\u6253\u5f00\u3010API \u670d\u52a1\u5730\u5740\u3011\u3002

\u70b9\u51fb\u3010Authorize\u3011\uff0c\u5728\u3010value\u3011\u4e2d\u8f93\u5165\u7cfb\u7edf\u7684 API Key\u3002

"},{"location":"user_manual/X-Pack/system_API/#32-authorize","title":"3.2 \u83b7\u53d6 Authorize","text":"

\u8c03\u7528 captcha \u63a5\u53e3\uff0c\u83b7\u53d6\u9a8c\u8bc1\u7801\uff0c\u83b7\u53d6\u5230\u7684\u9a8c\u8bc1\u7801\u662f Base64 \u7f16\u7801\u7684 PNG \u56fe\u7247\u6570\u636e\u3002

\u6ce8\u610f\uff1a\u9700\u81ea\u884c\u5c06 Base64 \u6570\u636e\u89e3\u7801\u5e76\u8f6c\u6362\u4e3a\u56fe\u7247\u6587\u4ef6\u3002

\u5728\u5e94\u7528\u6982\u89c8\u9875\u9762\u590d\u5236\u5e94\u7528\u7684 access_token\u3002

\u5728 API \u5730\u5740\u627e\u5230\u5bf9\u8bdd\u7528\u6237/\u767b\u5f55\uff0c\u8f93\u5165 access_token\uff0c\u586b\u5165\u8d26\u53f7\u5bc6\u7801\u7b49\u4fe1\u606f\uff0c\u751f\u6210\u767b\u5f55\u7684 token\u3002

"},{"location":"user_manual/X-Pack/system_API/#33-api","title":"3.3 API \u8c03\u7528","text":"

\u8fdb\u5165\u5e94\u7528\u3010\u6982\u89c8\u3011\u7684 API \u6587\u6863\u5730\u5740\uff0c\u5c06\u83b7\u53d6\u7684 token \u586b\u5165\u3010Authorize\u3011\u4e2d\uff0c\u5373\u53ef\u6839\u636e\uff1a\u901a\u8fc7 API Key \u8fdb\u884c\u5bf9\u8bdd\uff0c\u6b63\u5e38\u8fdb\u884c API \u5bf9\u8bdd\u3002

"},{"location":"user_manual/X-Pack/theme_settings/","title":"\u5916\u89c2\u8bbe\u7f6e","text":"

\u53ef\u8bbe\u7f6e\u7cfb\u7edf\u7684\u4e3b\u9898\u8272\u3001\u7f51\u7ad9 logo\u3001\u767b\u5f55 logo\u3001\u767b\u5f55\u80cc\u666f\u56fe\u3001\u7f51\u7ad9\u540d\u79f0\u3001\u6b22\u8fce\u8bed\u7b49\uff0c\u4ee5\u53ca\u4e3b\u9875\u53f3\u4e0a\u65b9\u7528\u6237\u624b\u518c\u3001\u8bba\u575b\u6c42\u52a9\u3001\u9879\u76ee\u5730\u5740\u7b49\u5e73\u53f0\u4fe1\u606f\u7684\u663e\u793a\u8bbe\u7f6e\u3002

"},{"location":"user_manual/X-Pack/user/","title":"\u7528\u6237\u7ba1\u7406","text":""},{"location":"user_manual/X-Pack/user/#1","title":"1 \u7528\u6237\u5217\u8868","text":"

\u652f\u6301\u591a\u7528\u6237\u4f53\u7cfb\uff0c\u7cfb\u7edf\u7ba1\u7406\u5458\u53ef\u4ee5\u521b\u5efa\u53ca\u7ba1\u7406\u7528\u6237\u3002

"},{"location":"user_manual/X-Pack/user/#2","title":"2 \u521b\u5efa\u7528\u6237","text":"

\u652f\u6301\u7cfb\u7edf\u7ba1\u7406\u5458\u521b\u5efa\u7528\u6237\uff1a

  • \u7528\u6237\u540d\uff1a\u7528\u6237\u8d26\u53f7\u4fe1\u606f\uff0c\u4e0d\u652f\u6301\u4fee\u6539\uff1b
  • \u59d3\u540d\uff1a\u7528\u6237\u59d3\u540d\uff1b
  • \u90ae\u7bb1\uff1a\u7528\u6237\u90ae\u7bb1\uff1b
  • \u624b\u673a\u53f7\uff1a\u7528\u6237\u624b\u673a\u53f7\uff1b
  • \u9ed8\u8ba4\u5bc6\u7801\uff1a\u9ed8\u8ba4\u4e3aMaxKB@123..\u3002
  • \u89d2\u8272\u8bbe\u7f6e\uff1a
    • \u7528\u6237\u53ef\u4ee5\u8bbe\u7f6e\u591a\u4e2a\u89d2\u8272\uff0c\u81f3\u5c11\u8bbe\u7f6e 1 \u4e2a\u89d2\u8272\uff1b
    • \u9009\u62e9\u666e\u901a\u7528\u6237\u548c\u5de5\u4f5c\u7a7a\u95f4\u89d2\u8272\u65f6\u9700\u8981\u8bbe\u7f6e\u5de5\u4f5c\u7a7a\u95f4\uff1b
    • \u9009\u62e9\u7cfb\u7edf\u7ba1\u7406\u5458\u89d2\u8272\u65e0\u5de5\u4f5c\u7a7a\u95f4\u9009\u9879\u3002

"},{"location":"user_manual/X-Pack/user/#3","title":"3 \u7f16\u8f91\u7528\u6237","text":"

\u7528\u6237\u540d\u4e0d\u53ef\u4ee5\u7f16\u8f91\uff0c\u5176\u4ed6\u5c5e\u6027\u5747\u53ef\u4ee5\u7f16\u8f91\u3002

\u7528\u6237\u72b6\u6001\u5df2\u7981\u7528\uff0c\u5219\u7528\u6237\u65e0\u6cd5\u767b\u5f55 MaxKB\u3002

"},{"location":"user_manual/X-Pack/user/#4","title":"4 \u91cd\u7f6e\u5bc6\u7801","text":"

\u7cfb\u7edf\u7ba1\u7406\u5458\u53ef\u4ee5\u7ed9\u6bcf\u4e2a\u7528\u6237\u4fee\u6539\u5bc6\u7801\uff0c\u5728\u7528\u6237\u5217\u8868\u4e2d\uff0c\u70b9\u51fb\u3010\u4fee\u6539\u5bc6\u7801\u3011\uff0c\u5f39\u51fa\u4fee\u6539\u5bc6\u7801\u5bf9\u8bdd\u6846\uff0c\u4fdd\u5b58\u540e\u4fee\u6539\u6210\u529f\u3002

"},{"location":"user_manual/X-Pack/user/#5","title":"5 \u5220\u9664\u7528\u6237","text":"

\u5728\u7528\u6237\u5217\u8868\u4e2d\uff0c\u70b9\u51fb\u3010\u5220\u9664\u3011\uff0c\u5f39\u51fa\u63d0\u793a\u6846\uff0c\u786e\u8ba4\u540e\u4ec5\u5220\u9664\u5f53\u524d\u7528\u6237\uff0c\u4e0d\u5f71\u54cd\u5176\u521b\u5efa\u7684\u5de5\u4f5c\u7a7a\u95f4\u8d44\u6e90\u3002 \u6ce8\u610f\uff1a\u7cfb\u7edf\u5185\u7f6e admin \u7528\u6237\u4e0d\u80fd\u88ab\u5220\u9664\u3002

"},{"location":"user_manual/X-Pack/user/#6","title":"6 \u67e5\u8be2\u7528\u6237","text":"

\u652f\u6301\u901a\u8fc7\u7528\u6237\u540d\u3001\u59d3\u540d\u3001\u90ae\u7bb1\u8fdb\u884c\u7528\u6237\u641c\u7d22\u3002

"},{"location":"user_manual/X-Pack/workspace/","title":"\u5de5\u4f5c\u7a7a\u95f4","text":"

\u5de5\u4f5c\u7a7a\u95f4\u662f MaxKB \u7684\u7ec4\u7ec7\u5355\u5143\uff0c\u7528\u4e8e\u5c06\u76f8\u5173\u7684\u4eba\u5458\u3001\u8d44\u6e90\u3001\u89d2\u8272\u7b49\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\u3002

  • \u5de5\u4f5c\u7a7a\u95f4\u4e4b\u95f4\u76f8\u4e92\u9694\u79bb\uff1b\u516c\u5171\u8d44\u6e90\u53ef\u901a\u8fc7\u5171\u4eab\u8d44\u6e90\u8fdb\u884c\u5206\u4eab\u3002
  • \u4f01\u4e1a\u7248\u521b\u5efa\u5de5\u4f5c\u7a7a\u95f4\u6ca1\u6709\u6570\u91cf\u9650\u5236\u3002

"},{"location":"user_manual/X-Pack/workspace/#1","title":"1 \u7a7a\u95f4\u7ba1\u7406","text":"

\u521b\u5efa\u5de5\u4f5c\u7a7a\u95f4\uff1a\u6253\u5f00\u521b\u5efa\u5de5\u4f5c\u7a7a\u95f4\u5bf9\u8bdd\u6846\uff0c\u586b\u5199\u5de5\u4f5c\u7a7a\u95f4\u540d\u79f0\uff08\u5fc5\u586b\uff0c1-64 \u4e2a\u5b57\u7b26\uff0c\u540d\u79f0\u552f\u4e00\uff0c\u4e0d\u80fd\u91cd\u590d\uff09\u3002

\u91cd\u547d\u540d\u5de5\u4f5c\u7a7a\u95f4\uff1a\u9009\u62e9\u76ee\u6807\u5de5\u4f5c\u7a7a\u95f4\uff0c\u70b9\u51fb\u3010\u91cd\u547d\u540d\u3011\u8fdb\u884c\u4fee\u6539\u3002

\u5220\u9664\u5de5\u4f5c\u7a7a\u95f4\uff1a\u9009\u62e9\u76ee\u6807\u5de5\u4f5c\u7a7a\u95f4\uff0c\u70b9\u51fb\u3010\u5220\u9664\u3011\u3002

  • \u5de5\u4f5c\u7a7a\u95f4\u4e0b\u6709\u8d44\u6e90\uff08\u77e5\u8bc6\u5e93\u3001\u5e94\u7528\u3001\u5de5\u5177\u3001\u6a21\u578b\uff09\u65f6\uff0c\u4e0d\u5141\u8bb8\u88ab\u5220\u9664\uff1b\u65e0\u8d44\u6e90\u65f6\u5141\u8bb8\u88ab\u5220\u9664\u3002
  • \u7cfb\u7edf\u5185\u7f6e\u7684\u9ed8\u8ba4\u5de5\u4f5c\u7a7a\u95f4\u4e0d\u80fd\u5220\u9664\uff0c\u53ef\u4ee5\u8fdb\u884c\u91cd\u547d\u540d\u3002

"},{"location":"user_manual/X-Pack/workspace/#2","title":"2 \u6210\u5458\u7ba1\u7406","text":"

\u6dfb\u52a0\u6210\u5458\u65f6\u9700\u8981\u9009\u62e9\u89d2\u8272\uff0c\u652f\u6301\u540c\u65f6\u6dfb\u52a0\u591a\u4e2a\u6210\u5458\u548c\u591a\u4e2a\u89d2\u8272\u3002

  • \u7cfb\u7edf\u7ba1\u7406\u5458\u652f\u6301\u4e3a\u6240\u6709\u5de5\u4f5c\u7a7a\u95f4\u6dfb\u52a0\u6210\u5458\uff0c\u5de5\u4f5c\u7a7a\u95f4\u7ba1\u7406\u5458\u4ec5\u663e\u793a\u5f53\u524d\u7528\u6237\u4f5c\u4e3a\u5de5\u4f5c\u7a7a\u95f4\u7ba1\u7406\u5458\u89d2\u8272\u7684\u5de5\u4f5c\u7a7a\u95f4\u3002
  • \u5de5\u4f5c\u7a7a\u95f4\u7ba1\u7406\u5458\u7684\u89d2\u8272\u5217\u8868\u4ec5\u663e\u793a\u666e\u901a\u7528\u6237\u89d2\u8272\u548c\u7ee7\u627f\u666e\u901a\u7528\u6237\u89d2\u8272\u7684\u81ea\u5b9a\u4e49\u89d2\u8272\u3002

\u79fb\u9664\u6210\u5458\u70b9\u51fb\u3010\u79fb\u9664\u3011\u540e\uff0c\u79fb\u9664\u6210\u5458\u7684\u5f53\u524d\u89d2\u8272\u3002

"},{"location":"user_manual/app/app-view/","title":"\u5e94\u7528\u6982\u89c8","text":"

\u521b\u5efa\u5b8c\u5e94\u7528\uff0c\u8fdb\u5165\u5728\u6982\u89c8\u9875\u9762\u53ef\u4ee5\u8fdb\u884c\u542f\u7528/\u7981\u7528/\u91cd\u65b0\u751f\u6210\u516c\u5f00\u8bbf\u95ee\u94fe\u63a5\u3001\u6f14\u793a\u3001\u5d4c\u5165\u7b2c\u4e09\u65b9\u3001\u8bbf\u95ee\u9650\u5236\u4ee5\u53ca API Key \u7ba1\u7406\u3002

"},{"location":"user_manual/app/app-view/#1","title":"1 \u516c\u5f00\u8bbf\u95ee\u94fe\u63a5","text":"

\u516c\u5f00\u8bbf\u95ee\u94fe\u63a5\u652f\u6301\u5f00\u5173\u8bbe\u7f6e\u548c\u91cd\u65b0\u751f\u6210\u3002\u70b9\u51fb\u6f14\u793a\u6216\u590d\u5236\u516c\u5f00\u8bbf\u95ee\u94fe\u63a5\u81f3\u6d4f\u89c8\u5668\u8fdb\u5165\u95ee\u7b54\u9875\u9762\u3002

\u5728\u95ee\u7b54\u540e\uff0c\u53ef\u4ee5\u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u5bfc\u51fa\u6309\u94ae\uff0c\u53ef\u4ee5\u9009\u62e9\u5c06\u5f53\u524d\u7684\u5bf9\u8bdd\u8bb0\u5f55\u5bfc\u51fa\u4e3a Markdown\u3001HTML \u548c PDF \u6587\u4ef6\u3002

\u5f53\u9009\u62e9\u5bfc\u51fa\u4e3a PDF \u65f6\uff0c\u652f\u6301\u9009\u62e9\u5bfc\u51fa\u4e3a PDF \u6216\u56fe\u7247\u3002

\u5bf9\u4e8e\u5df2\u6253\u5f00\u7684\u516c\u5f00\u94fe\u63a5\uff0c\u5982\u679c\u6b64\u65f6\u5173\u95ed\u5f53\u524d\u516c\u5f00\u94fe\u63a5\u6216\u91cd\u65b0\u751f\u6210\u65b0\u7684\u516c\u5f00\u8bbf\u95ee\u94fe\u63a5\uff0c\u6b64\u65f6\u8bbf\u95ee\u5c06\u63d0\u793a\uff1a\u62b1\u6b49\uff0c\u5f53\u524d\u6b63\u5728\u7ef4\u62a4\uff0c\u65e0\u6cd5\u63d0\u4f9b\u670d\u52a1\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5\uff01

"},{"location":"user_manual/app/app-view/#2","title":"2 \u5d4c\u5165\u7b2c\u4e09\u65b9","text":"

MaxKB \u5e94\u7528\u652f\u6301\u96f6\u7f16\u7801\u5d4c\u5165\u5230\u4f01\u4e1a\u7684\u7b2c\u4e09\u65b9\u7cfb\u7edf\u3002 \u5728\u5e94\u7528\u6982\u89c8\u9875\u9762\u70b9\u51fb\u3010\u5d4c\u5165\u7b2c\u4e09\u65b9\u3011\uff0c\u590d\u5236\u5168\u5c4f\u6a21\u5f0f\u3001\u79fb\u52a8\u7aef\u6a21\u5f0f\u6216\u6d6e\u7a97\u6a21\u5f0f\u4ee3\u7801\u5d4c\u5165\u5230\u7b2c\u4e09\u65b9\u7cfb\u7edf\u4e2d\uff0c\u5373\u53ef\u5728\u7b2c\u4e09\u65b9\u7cfb\u7edf\u4e2d\u8fdb\u884c\u95ee\u7b54\u3002

"},{"location":"user_manual/app/app-view/#3","title":"3 \u8bbf\u95ee\u9650\u5236","text":"

MaxKB \u652f\u6301\u5bf9\u5e94\u7528\u8bbe\u7f6e\u6bcf\u4e2a\u5ba2\u6237\u7aef\u63d0\u95ee\u6b21\u6570\u9650\u5236\u548c\u5d4c\u5165\u7b2c\u4e09\u65b9\u767d\u540d\u5355\u9632\u76d7\u94fe\u8bbe\u7f6e\u3002

\u6ce8\u610f\uff1a\u8eab\u4efd\u9a8c\u8bc1\u4e3a X-Pack \u529f\u80fd\u3002

"},{"location":"user_manual/app/app-view/#4","title":"4 \u663e\u793a\u8bbe\u7f6e","text":"

\u793e\u533a\u7248\u672c\u5e94\u7528\u652f\u6301\u8bed\u8a00\u4ee5\u53ca\u663e\u793a\u6267\u884c\u8be6\u60c5\u7684\u8bbe\u7f6e\u3002X-Pack \u529f\u80fd\u66f4\u591a\u8bbe\u7f6e\uff0c\u8be6\u60c5\u89c1\uff1a\u5e94\u7528\u663e\u793a

"},{"location":"user_manual/app/app-view/#5-api","title":"5 API \u8bbf\u95ee\u51ed\u636e","text":"

\u5982\u679c\u5916\u90e8\u7cfb\u7edf\u9700\u8981\u901a\u8fc7 API \u7684\u65b9\u5f0f\u8fdb\u884c\u8c03\u7528\uff0c\u9700\u8981\u67e5\u770b API \u6587\u6863\u548c\u5f53\u524d\u5e94\u7528\u7684 API Key\uff0c\u70b9\u51fb \u3010API Key \u3011\uff0c\u6253\u5f00 API Key \u7684\u7ba1\u7406\u5bf9\u8bdd\u6846\uff0c\u652f\u6301\u521b\u5efa\u3001\u542f\u7528/\u7981\u7528\u3001\u5220\u9664 API Key\u3002

"},{"location":"user_manual/app/app/","title":"\u5e94\u7528\u6982\u8ff0","text":""},{"location":"user_manual/app/app/#1","title":"1 \u529f\u80fd\u6982\u8ff0","text":"

MaxKB \u63d0\u4f9b\u9884\u914d\u7f6e\u6a21\u677f\u548c\u7ec4\u4ef6\uff0c\u53ef\u5feb\u901f\u521b\u5efa\u57fa\u7840\u95ee\u7b54\u5e94\u7528\uff0c\u6216\u5bf9\u590d\u6742\u4e1a\u52a1\u6d41\u7a0b\u8fdb\u884c\u9ad8\u7ea7\u7f16\u6392\uff0c\u6253\u9020\u4e13\u5c5e AI \u52a9\u624b\u3002

  • \u6587\u4ef6\u5939\u7ba1\u7406\uff1a\u5e94\u7528\u901a\u8fc7\u6587\u4ef6\u5939\u8fdb\u884c\u7ba1\u7406\uff0c\u6839\u76ee\u5f55\u4e0b\u53ef\u5efa\u7acb\u6700\u591a\u4e09\u7ea7\u7684\u5b50\u6587\u4ef6\u5939\u3002\u6bcf\u4e00\u7ea7\u6587\u4ef6\u5939\u5185\u5747\u53ef\u521b\u5efa\u76f8\u5e94\u7684\u5e94\u7528\u3002\u7528\u6237\u53ef\u4ee5\u521b\u5efa\u5e94\u7528\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u8d44\u6e90\u6388\u6743\u540e\u7684\u5e94\u7528\u3002
  • \u72b6\u6001\u529f\u80fd\uff1a\u5e94\u7528\u663e\u793a\u3010\u672a\u53d1\u5e03\u3011\u6216\u3010\u5df2\u53d1\u5e03\u3011\u72b6\u6001\uff08\u9996\u6b21\u521b\u5efa\u5e94\u7528\u662f\u4fdd\u5b58\u672a\u53d1\u5e03\uff0c\u5373\u4e3a\u672a\u53d1\u5e03\u72b6\u6001\uff09\uff0c\u4ee5\u53ca\u53d1\u5e03\u65f6\u95f4\u3002

"},{"location":"user_manual/app/app/#2","title":"2 \u5e94\u7528\u7c7b\u578b","text":"

\u7b80\u5355\u914d\u7f6e\uff1a\u63d0\u4f9b\u4e86\u8f83\u4e3a\u57fa\u7840\u7684\u529f\u80fd\u548c\u8bbe\u7f6e\u9009\u9879\uff0c\u57fa\u672c\u529f\u80fd\u5b8c\u5907\u6ee1\u8db3\u5927\u591a\u6570\u57fa\u672c\u7684\u95ee\u7b54\u9700\u6c42\uff0c\u9002\u7528\u4e8e\u9700\u8981\u5feb\u901f\u4e0a\u7ebf\u667a\u80fd\u4f53\u5e94\u7528\u3002

\u9ad8\u7ea7\u7f16\u6392\uff1a\u652f\u6301\u7528\u6237\u521b\u5efa\u7b26\u5408\u4e1a\u52a1\u903b\u8f91\u7684\u5de5\u4f5c\u6d41\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u4f7f\u7528\u5224\u65ad\u5668\u3001\u95ee\u9898\u4f18\u5316\u3001\u51fd\u6570\u5e93\u3001\u5185\u7f6e\u6807\u7b7e\u7b49\u529f\u80fd\uff0c\u6ee1\u8db3\u7528\u6237\u95ee\u9898\u5206\u7c7b\u3001\u654f\u611f\u8bcd\u68c0\u7d22\u7b49\u5404\u7c7b\u9700\u6c42\uff0c\u9002\u7528\u4e8e\u9700\u8981\u590d\u6742\u903b\u8f91\u548c\u81ea\u5b9a\u4e49\u5de5\u4f5c\u6d41\u7684\u573a\u666f\u3002

"},{"location":"user_manual/app/app/#3","title":"3 \u5e94\u7528\u8bbe\u7f6e","text":"

\u5e94\u7528\u521b\u5efa\u5b8c\u6210\uff0c\u8fdb\u5165\u5230\u5e94\u7528\u9875\u9762\uff0c\u67e5\u770b\u5e94\u7528\u6982\u89c8\u4ee5\u53ca\u8fdb\u884c\u76f8\u5173\u8bbe\u7f6e\u3001\u5bf9\u63a5\u3002

\u6ce8\u610f\uff1a\u5e94\u7528\u63a5\u5165\u4ee5\u53ca\u5bf9\u8bdd\u7528\u6237\u4e3a X-Pack \u529f\u80fd\u3002

\u5e94\u7528\u652f\u6301\u5bfc\u51fa\u64cd\u4f5c\uff0c\u5bfc\u51fa\u540e\u6587\u4ef6\u540d\u79f0\u4e3a\uff1a\u5e94\u7528\u540d\u79f0.mk\u3002 \u5bf9\u4e8e\u9ad8\u7ea7\u7f16\u6392\u7c7b\u578b\u7684\u5e94\u7528\uff0c\u5bfc\u51fa\u5185\u5bb9\u4e3a\u5305\u62ec\u5de5\u4f5c\u6d41\u4e2d\u6240\u6709\u8282\u70b9\u7684\u53c2\u6570\u8bbe\u7f6e\u4ee5\u53ca\u51fd\u6570\u5185\u5bb9\uff0c\u6d41\u7a0b\u8282\u70b9\u4e2d\u6240\u9009\u62e9\u7684\u77e5\u8bc6\u5e93\u548c\u6a21\u578b\u4fe1\u606f\u4e0d\u5bfc\u51fa\u3002

\u5728\u5e94\u7528\u9875\u9762\uff0c\u70b9\u51fb\u3010\u5bfc\u5165\u5e94\u7528\u3011\uff0c\u5373\u53ef\u5bfc\u5165\u5e94\u7528\u6587\u4ef6\uff08\u6587\u4ef6\u540e\u7f00\u4e3a.mk\uff09\u3002

"},{"location":"user_manual/app/hit-testing/","title":"\u547d\u4e2d\u6d4b\u8bd5","text":"

\u5e94\u7528\u547d\u4e2d\u6d4b\u8bd5\u529f\u80fd\u662f\u7b80\u6613\u914d\u7f6e\u7c7b\u578b\u5e94\u7528\u9488\u5bf9\u7528\u6237\u63d0\u95ee\u8fdb\u884c\u4e00\u4e2a\u6a21\u62df\u6d4b\u8bd5\uff0c\u7528\u6765\u8c03\u6574\u5206\u6bb5\u5185\u5bb9\u548c\u5173\u8054\u95ee\u9898\u4ece\u800c\u63d0\u9ad8\u5206\u6bb5\u5185\u5bb9\u7684\u5339\u914d\u5ea6\uff0c\u4ece\u800c\u63d0\u5347\u56de\u7b54\u6548\u679c\u3002\u8f93\u5165\u6d4b\u8bd5\u95ee\u9898\uff0c\u7cfb\u7edf\u6839\u636e\u68c0\u7d22\u6a21\u5f0f\u5728\u5f53\u524d\u5e94\u7528\u5173\u8054\u7684\u77e5\u8bc6\u5e93\u4e2d\u8fdb\u884c\u68c0\u7d22\uff0c\u7136\u540e\u6309\u7167\u76f8\u4f3c\u5ea6\u548c\u8fd4\u56deTop \u5206\u6bb5\u6570\u7b5b\u9009\u8fd4\u56de\u6ee1\u8db3\u6761\u4ef6\u7684\u5206\u6bb5\u3002\u5982\u6709\u5fc5\u8981\uff0c\u53ef\u5bf9\u6307\u5b9a\u8fd4\u56de\u5206\u6bb5\u5185\u5bb9\u8fdb\u884c\u518d\u6b21\u7f16\u8f91\u3002

"},{"location":"user_manual/app/log/","title":"\u5bf9\u8bdd\u65e5\u5fd7","text":"

\u5728\u5bf9\u8bdd\u65e5\u5fd7\u8bb0\u5f55\u4e86\u6240\u6709\u7528\u6237\u4f1a\u8bdd\u4e2d\u7684\u95ee\u7b54\u8be6\u60c5\uff0c\u5305\u62ec\u7528\u6237\u5bf9AI \u56de\u7b54\u7684\u53cd\u9988\u4fe1\u606f\uff0c\u7ef4\u62a4\u4eba\u5458\u53ef\u4ee5\u901a\u8fc7\u67e5\u770b\u5bf9\u8bdd\u65e5\u5fd7\u8be6\u60c5\u5e76\u53c2\u8003\u7528\u6237\u53cd\u9988\u8fdb\u4e00\u6b65\u4fee\u6b63\u7b54\u6848\u3002

\u5bf9\u8bdd\u65e5\u5fd7\u4e2d\uff0c\u53ef\u4ee5\u6309\u6458\u8981\u6216\u7528\u6237\u8fdb\u884c\u67e5\u8be2\u3002\u5bf9\u8bdd\u65e5\u5fd7\u652f\u6301\u67e5\u8be2\u8fc7\u53bb 7 \u5929\u300130 \u5929\u300190 \u5929\u3001\u8fc7\u53bb\u534a\u5e74\u7684\u5bf9\u5185\u5bb9\u3002

"},{"location":"user_manual/app/log/#1","title":"1 \u65e5\u5fd7\u8be6\u60c5","text":"

\u65e5\u5fd7\u8be6\u60c5\u4e3a\u6bcf\u4e2a\u7528\u6237\u771f\u5b9e\u7684\u95ee\u7b54\u573a\u666f\uff0c\u95ee\u7b54\u4e2d\u7528\u6237\u7684\u53cd\u9988\u53ea\u80fd\u67e5\u770b\u4e0d\u80fd\u4fee\u6539\u3002

\u70b9\u51fb\u65e5\u5fd7\u5217\u8868\u4e2d\u7684\u6458\u8981\uff0c\u53ef\u67e5\u770b\u5bf9\u8bdd\u8be6\u7ec6\u5185\u5bb9\u3002

\u8fd0\u8425\u4eba\u5458\u53ef\u4ee5\u6839\u636e\u7528\u6237\u63d0\u95ee\u3001AI \u56de\u7b54\u4ee5\u53ca\u7528\u6237\u7684\u53cd\u9988\u6765\u7f16\u8f91\u548c\u6807\u6ce8\uff0c\u5e76\u4fdd\u5b58\u81f3\u77e5\u8bc6\u5e93\uff0c\u8fdb\u4e00\u6b65\u5b8c\u5584\u5e76\u63d0\u5347\u6548\u679c\u3002

"},{"location":"user_manual/app/log/#2","title":"2 \u6e05\u9664\u7b56\u7565","text":"

\u5e94\u7528\u5bf9\u8bdd\u8bb0\u5f55\u9ed8\u8ba4\u4fdd\u5b58\u671f\u9650\u662f 180 \u5929\uff0c\u5982\u679c\u8981\u6c42\u4fdd\u7559\u66f4\u957f\u65f6\u95f4\uff0c\u5f3a\u70c8\u5efa\u8bae\u4fee\u6539\u6b64\u53c2\u6570\u3002\u8bbe\u7f6e\u6e05\u9664\u7b56\u7565\u671f\u9650\u540e\uff0c\u7cfb\u7edf\u5c06\u521b\u5efa\u81ea\u52a8\u6e05\u9664\u4efb\u52a1\uff0c\u5e76\u5728\u6b21\u65e5 0 \u70b9\u6267\u884c\u3002

"},{"location":"user_manual/app/log/#3","title":"3 \u65e5\u5fd7\u5bfc\u51fa","text":"

\u652f\u6301\u5c06\u5bf9\u8bdd\u65e5\u5fd7\u5bfc\u51fa\uff0c\u67e5\u770b\u8be6\u7ec6\u7684\u5bf9\u8bdd\u60c5\u51b5\u3002

"},{"location":"user_manual/app/serialization/","title":"\u5e94\u7528\u5bfc\u51fa\u4e0e\u5bfc\u51fa","text":""},{"location":"user_manual/app/serialization/#1","title":"1 \u5e94\u7528\u5bfc\u51fa","text":"

\u5e94\u7528\u652f\u6301\u5bfc\u51fa\u64cd\u4f5c\uff0c\u5bfc\u51fa\u540e\u6587\u4ef6\u540d\u79f0\u4e3a\uff1a\u5e94\u7528\u540d\u79f0.mk\u3002 \u5bf9\u4e8e\u9ad8\u7ea7\u7f16\u6392\u7c7b\u578b\u7684\u5e94\u7528\uff0c\u5bfc\u51fa\u5185\u5bb9\u4e3a\u5305\u62ec\u5de5\u4f5c\u6d41\u4e2d\u6240\u6709\u8282\u70b9\u7684\u53c2\u6570\u8bbe\u7f6e\u4ee5\u53ca\u51fd\u6570\u5185\u5bb9\uff0c\u6d41\u7a0b\u8282\u70b9\u4e2d\u6240\u9009\u62e9\u7684\u77e5\u8bc6\u5e93\u548c\u6a21\u578b\u4fe1\u606f\u4e0d\u5bfc\u51fa\u3002

"},{"location":"user_manual/app/serialization/#2","title":"2 \u5e94\u7528\u5bfc\u5165","text":"

\u5728\u5e94\u7528\u9875\u9762\uff0c\u70b9\u51fb\u3010\u5bfc\u5165\u5e94\u7528\u3011\uff0c\u5373\u53ef\u5bfc\u5165\u5e94\u7528\u6587\u4ef6\uff08\u6587\u4ef6\u540e\u7f00\u4e3a.mk\uff09\u3002

"},{"location":"user_manual/app/simple_app/","title":"\u7b80\u5355\u914d\u7f6e\u5e94\u7528","text":"

\u70b9\u51fb\u3010\u521b\u5efa\u5e94\u7528\u3011\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u4ee5\u53ca\u5e94\u7528\u63cf\u8ff0\uff0c\u9009\u62e9\u3010\u7b80\u6613\u914d\u7f6e\u3011\uff0c\u70b9\u51fb\u3010\u521b\u5efa\u3011\uff0c\u8fdb\u5165\u7b80\u6613\u914d\u7f6e\u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u3002

\u5de6\u4fa7\u4e3a\u5e94\u7528\u4fe1\u606f\uff0c\u53f3\u4fa7\u4e3a\u8c03\u8bd5\u9884\u89c8\u754c\u9762\u3002

  • \u5e94\u7528\u540d\u79f0\uff1a\u63d0\u95ee\u65f6\u5bf9\u8bdd\u6846\u7684\u6807\u9898\u548c\u540d\u5b57\u3002
  • \u5e94\u7528\u63cf\u8ff0\uff1a\u5bf9\u5e94\u7528\u573a\u666f\u53ca\u7528\u9014\u7684\u7b80\u8981\u63cf\u8ff0\u3002
  • AI \u6a21\u578b\uff1a\u53ef\u9009\u62e9\u5728\u3010\u6a21\u578b\u3011\u4e2d\u6dfb\u52a0\u7684\u5927\u8bed\u8a00\u6a21\u578b\uff0c\u4e5f\u53ef\u76f4\u63a5\u6dfb\u52a0\u3002
  • \u89d2\u8272\u8bbe\u5b9a\uff1a\u901a\u8fc7\u7ed9\u6a21\u578b\u6307\u5b9a\u4e00\u4e2a\u7279\u5b9a\u7684\u89d2\u8272\u6216\u8eab\u4efd\uff0c\u6765\u6307\u5bfc\u6a21\u578b\u7684\u8f93\u51fa\u66f4\u52a0\u7b26\u5408\u7279\u5b9a\u7684\u573a\u666f\u6216\u4efb\u52a1\u9700\u6c42\uff0c\u53ef\u5728\u70b9\u51fb\u53f3\u4fa7\u3010\u751f\u6210\u3011\u6309\u94ae\uff0c\u751f\u6210\u6240\u9700\u63d0\u793a\u8bcd\u3002
  • \u63d0\u793a\u8bcd\uff1a\u7cfb\u7edf\u9ed8\u8ba4\u6709\u667a\u80fd\u77e5\u8bc6\u5e93\u7684\u63d0\u793a\u8bcd\uff0c\u7528\u6237\u53ef\u4ee5\u81ea\u5b9a\u4e49\u901a\u8fc7\u8c03\u6574\u63d0\u793a\u8bcd\u5185\u5bb9\uff0c\u53ef\u4ee5\u5f15\u5bfc\u5927\u6a21\u578b\u804a\u5929\u65b9\u5411\uff0c\u8be5\u63d0\u793a\u8bcd\u4f1a\u88ab\u56fa\u5b9a\u5728\u4e0a\u4e0b\u6587\u7684\u5f00\u5934\u3002
  • \u5386\u53f2\u804a\u5929\u8bb0\u5f55\uff1a\u5927\u6a21\u578b\u63d0\u4ea4\u5f53\u524d\u4f1a\u8bdd\u4e2d\u6700\u540e N \u6761\u5bf9\u8bdd\u5185\u5bb9\uff0c\u5982\u679c\u4e3a 0\uff0c\u5219\u4ec5\u5411\u5927\u6a21\u578b\u63d0\u4ea4\u5f53\u524d\u95ee\u9898\u3002
  • \u5173\u8054\u77e5\u8bc6\u5e93\uff1a\u77e5\u8bc6\u5e93\u53ef\u8bbe\u7f6e\u68c0\u7d22\u65b9\u5f0f\u3001\u77e5\u8bc6\u5e93\u7684\u76f8\u4f3c\u5ea6\uff0c\u5f15\u7528\u5206\u6bb5\u6570 Top-N \u548c\u6700\u5927\u5f15\u7528\u5b57\u7b26\u6570\u3001\u65e0\u5f15\u7528\u77e5\u8bc6\u5e93\u5206\u6bb5\u65f6\u7684\u56de\u7b54\u7b56\u7565\u4ee5\u53ca\u662f\u5426\u8fdb\u884c\u95ee\u9898\u4f18\u5316\u7b49\u3002
  • \u5f00\u573a\u767d\uff1a\u6253\u5f00\u5bf9\u8bdd\u65f6\uff0c\u7cfb\u7edf\u5f39\u51fa\u7684\u9ed8\u8ba4\u5f15\u5bfc\u8bf4\u660e\u3002
  • MCP\uff1a\u901a\u8fc7\u5f15\u7528 MCP \u548c\u81ea\u5b9a\u4e49 MCP Server Config \u4e24\u79cd\u65b9\u5f0f\u8fdb\u884c\u8c03\u7528\uff0c\u652f\u6301\u6dfb\u52a0\u591a\u4e2aMCP\uff0c\u5927\u6a21\u578b\u5c06\u6839\u636e\u63d0\u793a\u8bcd\u5185\u5bb9\u8c03\u7528\u5408\u9002\u7684\u5de5\u5177\u3002
  • \u5de5\u5177\uff1a\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u573a\u666f\u7075\u6d3b\u9009\u7528\u81ea\u5b9a\u4e49\u5de5\u5177\uff0c\u7cfb\u7edf\u81ea\u52a8\u5c06\u5de5\u5177\u80fd\u529b\u5c01\u88c5\u4e3aMCP\u670d\u52a1\u5e76\u5bf9\u63a5\u6a21\u578b\uff0cAI \u80fd\u591f\u6839\u636e\u5bf9\u8bdd\u4e0a\u4e0b\u6587\u667a\u80fd\u5224\u65ad\u662f\u5426\u8c03\u7528\u5de5\u5177\u3002
  • \u8f93\u51fa MCP/\u5de5\u5177\u6267\u884c\u8fc7\u7a0b\uff1a\u5f00\u542f\u540e\uff0c\u6a21\u578b\u5728\u751f\u6210\u6700\u7ec8\u7b54\u6848\u524d\uff0c\u4f1a\u5148\u8f93\u51fa\u4e00\u6bb5\u7f6e\u4e8e\u6807\u7b7e\u5185\u7684\u63a8\u7406\u8fc7\u7a0b\uff0c\u968f\u540e\u518d\u7ed9\u51fa\u6b63\u5f0f\u56de\u590d\u3002
  • \u8bed\u97f3\u8f93\u5165\uff1a\u5728\u8bed\u97f3\u8f93\u5165\u5b8c\u6210\u540e\u4f1a\u8f6c\u5316\u4e3a\u6587\u5b57\u540e\u518d\u53d1\u9001\u63d0\u95ee\uff0c\u9700\u8981\u8bed\u97f3\u8bc6\u522b\u6a21\u578b\u7684\u652f\u6301\u3002
  • \u8bed\u97f3\u64ad\u653e\uff1a\u5c06\u5927\u6a21\u578b\u751f\u6210\u7684\u56de\u7b54\u5185\u5bb9\u8f6c\u6362\u4e3a\u8bed\u97f3\u8fdb\u884c\u64ad\u653e\uff0c\u9700\u8981\u8bed\u97f3\u5408\u6210\u6a21\u578b\u7684\u652f\u6301\u3002

\u5e94\u7528\u4fe1\u606f\u8bbe\u7f6e\u5b8c\u6210\u540e\uff0c\u70b9\u51fb\u3010\u4fdd\u5b58\u5e76\u53d1\u5e03\u3011\u540e\uff0c\u5e94\u7528\u8bbe\u7f6e\u624d\u751f\u6548\u3002

\u63d0\u793a\u8bcd\u662f\u5728\u6bcf\u6b21\u5bf9\u8bdd\u5f00\u59cb\u65f6\u56fa\u5b9a\u6ce8\u5165\u7684\u4e0a\u4e0b\u6587\u6307\u4ee4\uff0c\u7528\u4e8e\u4e3a\u6a21\u578b\u786e\u7acb\u8eab\u4efd\u3001\u8bed\u6c14\u3001\u77e5\u8bc6\u8fb9\u754c\u53ca\u8f93\u51fa\u683c\u5f0f\u7b49\u524d\u7f6e\u89c4\u5219\uff0c\u4ece\u800c\u786e\u4fdd\u56de\u590d\u7cbe\u51c6\u3001\u98ce\u683c\u4e00\u81f4\u4e14\u53ef\u63a7\u3002

  • \u53d8\u91cf\u652f\u6301\uff1a\u5982 {data} \u81ea\u52a8\u63d2\u5165\u77e5\u8bc6\u5e93\u7247\u6bb5\uff0c{question} \u5f15\u7528\u7528\u6237\u95ee\u9898\uff0c\u5b9e\u73b0\u7cbe\u51c6\u3001\u53ef\u63a7\u3001\u4f4e\u5e7b\u89c9\u7684\u667a\u80fd\u56de\u590d\u3002

  • \u5178\u578b\u914d\u7f6e\u793a\u4f8b

    • \u89d2\u8272\u951a\u5b9a\uff1a\u4f60\u662f\u4e00\u4f4d\u4e13\u4e1a\u7684\u6570\u636e\u5206\u6790\u4e13\u5bb6\uff0c\u7cbe\u901a MySQL\u6570\u636e\u5e93SQL\u8bed\u8a00\uff0c\u80fd\u591f\u719f\u7ec3\u8fd0\u7528 mcp-mysql \u5de5\u5177\u8fdb\u884cSQL\u9a8c\u8bc1\u548c\u67e5\u8be2\uff0c\u8fd8\u80fd\u4f7f\u7528 quickchart-server \u5de5\u5177\u7ed8\u5236\u56fe\u8868\uff0c\u5e76\u5bf9\u76f8\u5173\u6570\u636e\u8fdb\u884c\u6df1\u5165\u5206\u6790\u548c\u89e3\u91ca\u3002
    • \u8f93\u51fa\u683c\u5f0f\uff1a\u8bf7\u7528 Markdown \u8868\u683c\u5448\u73b0\u7b54\u6848\uff0c\u5e76\u5728\u672b\u5c3e\u7ed9\u51fa 20 \u5b57\u4ee5\u5185\u7684\u603b\u7ed3\u3002
    • \u6280\u80fd\u6280\u80fd\uff1a\u751f\u6210\u5e76\u9a8c\u8bc1SQL\u3001\u7ed8\u5236\u56fe\u8868\u3001\u6570\u636e\u7684\u5206\u6790\u548c\u89e3\u91ca
    • \u98ce\u683c\u8bed\u6c14\uff1a\u4fdd\u6301\u4eb2\u5207\u3001\u7b80\u6d01\uff0c\u907f\u514d\u4f7f\u7528\u4e13\u4e1a\u672f\u8bed\u3002
    • \u9650\u5236\u8981\u6c42\uff1a\u4ec5\u56f4\u7ed5\u4e0e\u751f\u6210SQL\u3001\u5229\u7528\u5de5\u5177\u67e5\u8be2\u9a8c\u8bc1\u3001\u751f\u6210\u56fe\u7247\u4ee5\u53ca\u6570\u636e\u7684\u5206\u6790\u548c\u89e3\u91ca\u76f8\u5173\u7684\u5185\u5bb9\u8fdb\u884c\u56de\u7b54\uff0c\u62d2\u7edd\u56de\u7b54\u4e0d\u6d89\u53ca\u8fd9\u4e9b\u5185\u5bb9\u7684\u8bdd\u9898\u3002

\u901a\u8fc7\u5408\u7406\u7f16\u6392\u63d0\u793a\u8bcd\uff0c\u7ba1\u7406\u5458\u53ef\u5728\u4e0d\u66f4\u6362\u6a21\u578b\u7684\u524d\u63d0\u4e0b\uff0c\u5b9e\u73b0\u591a\u573a\u666f\u3001\u591a\u89d2\u8272\u7684\u5feb\u901f\u5207\u6362\uff0c\u663e\u8457\u964d\u4f4e\u5927\u6a21\u578b\u5e7b\u89c9\u98ce\u9669\u5e76\u63d0\u5347\u7528\u6237\u4f53\u9a8c\u3002

\u7b80\u6613\u5e94\u7528\u7684\u7cfb\u7edf\u63d0\u793a\u8bcd\u652f\u6301\u57fa\u4e8e\u7528\u6237\u8f93\u5165\u7684\u4e3b\u9898\u5185\u5bb9\uff0c\u81ea\u52a8\u751f\u6210\u9ad8\u8d28\u91cf\u3001\u7ed3\u6784\u5b8c\u6574\u7684\u7cfb\u7edf\u63d0\u793a\u8bcd\uff0c\u8f85\u52a9\u7528\u6237\u5feb\u901f\u6784\u5efa\u9002\u7528\u4e8e\u5f53\u524d\u573a\u666f\u7684\u63d0\u793a\u6587\u672c\u3002

\u5f00\u573a\u767d\u517c\u5177\u201c\u81ea\u6211\u4ecb\u7ecd\u201d\u4e0e\u201c\u64cd\u4f5c\u63d0\u793a\u201d\u7684\u53cc\u91cd\u4f5c\u7528\uff0c\u80fd\u591f\u5728\u96f6\u6253\u6270\u7684\u524d\u63d0\u4e0b\uff0c\u544a\u8bc9\u7528\u6237\u201c\u6211\u662f\u8c01\u3001\u80fd\u505a\u4ec0\u4e48\u3001\u8be5\u600e\u4e48\u95ee\u201d\u3002\u5408\u7406\u8bbe\u8ba1\u7684\u5f00\u573a\u767d\u53ef\u663e\u8457\u964d\u4f4e\u9996\u6b21\u4f7f\u7528\u95e8\u69db\uff0c\u63d0\u5347\u540e\u7eed\u95ee\u7b54\u6548\u7387\u3002

  • \u652f\u6301 Markdown\uff0c\u53ef\u63d2\u5165\u7c97\u4f53\u3001\u94fe\u63a5\u3001\u6362\u884c\u3002
  • \u652f\u6301\u4f7f\u7528 \u6807\u7b7e\u7f16\u5199 HTML \u4ee3\u7801\u3002

    \u53ef\u53c2\u8003 MaxKB \u5f00\u573a\u767d\u53c2\u8003\u6a21\u677f\uff08\u57fa\u4e8e HTML \u7f16\u5199\uff09\u3002

    \u5f53\u7528\u6237\u63d0\u95ee\u540e\uff0c\u7cfb\u7edf\u4f18\u5148\u5728\u5df2\u5173\u8054\u7684\u77e5\u8bc6\u5e93\u4e2d\u6267\u884c\u5206\u6bb5\u68c0\u7d22\uff0c\u968f\u540e\u5c06\u547d\u4e2d\u7684\u5185\u5bb9\u6ce8\u5165\u63d0\u793a\u8bcd\uff0c\u518d\u4ea4\u7531\u5927\u6a21\u578b\u751f\u6210\u7b54\u6848\u3002\u5e94\u7528\u8bbe\u7f6e\u65f6\u53ef\u4ee5\u63a7\u5236\u68c0\u7d22\u884c\u4e3a\uff1a

    • \u68c0\u7d22\u6a21\u5f0f

      • \u5411\u91cf\u68c0\u7d22\uff1a\u57fa\u4e8e\u5411\u91cf\u76f8\u4f3c\u5ea6\uff0c\u9002\u5408\u5927\u6570\u636e\u91cf\u3001\u8bed\u4e49\u5339\u914d\u573a\u666f\u3002
      • \u5168\u6587\u68c0\u7d22\uff1a\u57fa\u4e8e\u6587\u672c\u76f8\u4f3c\u5ea6\uff0c\u9002\u5408\u5c0f\u6570\u636e\u91cf\u3001\u5173\u952e\u8bcd\u5339\u914d\u573a\u666f\u3002
      • \u6df7\u5408\u68c0\u7d22\uff1a\u540c\u65f6\u542f\u7528\u5411\u91cf + \u5168\u6587\uff0c\u517c\u987e\u7cbe\u5ea6\u4e0e\u53ec\u56de\uff0c\u9002\u7528\u4e8e\u4e2d\u7b49\u6570\u636e\u91cf\u3002
    • \u76f8\u4f3c\u5ea6\u9608\u503c\uff1a\u4ec5\u8fd4\u56de\u9ad8\u4e8e\u8bbe\u5b9a\u5206\u503c\uff08\u9ed8\u8ba4 0.60\uff09\u7684\u6bb5\u843d\uff0c\u8fc7\u6ee4\u4f4e\u76f8\u5173\u7ed3\u679c\u3002

    • \u5f15\u7528\u5206\u6bb5\u6570 Top-N\uff1a\u63a7\u5236\u6700\u591a\u5411\u5927\u6a21\u578b\u63d0\u4ea4 N \u6761\u9ad8\u76f8\u5173\u6bb5\u843d\uff0c\u907f\u514d\u4e0a\u4e0b\u6587\u8fc7\u957f\u3002
    • \u6700\u5927\u5f15\u7528\u5b57\u7b26\u6570\uff1a\u5bf9\u5165\u9009\u6bb5\u843d\u518d\u505a\u5b57\u7b26\u622a\u65ad\uff0c\u786e\u4fdd\u603b\u957f\u5ea6\u4e0d\u8d85\u8fc7\u8bbe\u5b9a\u4e0a\u9650\uff08\u9ed8\u8ba4 5,000 \u5b57\u7b26\uff09\u3002
    • \u65e0\u5f15\u7528\u65f6\u7684\u56de\u7b54\u7b56\u7565\uff1a\u5141\u8bb8\u5927\u6a21\u578b\u57fa\u4e8e\u901a\u7528\u77e5\u8bc6\u4f5c\u7b54\uff0c\u6216\u6307\u5b9a\u7edf\u4e00\u56de\u590d\uff08\u5982\u6682\u65e0\u76f8\u5173\u8d44\u6599\u201d\uff0c\u62d2\u7edd\u7f16\u9020\uff09\u3002
    • \u95ee\u9898\u4f18\u5316\u5f00\u5173\uff1a\u542f\u7528\u540e\uff0c\u7cfb\u7edf\u4f1a\u5148\u5c06\u7528\u6237\u95ee\u9898\u6539\u5199\u4e3a\u66f4\u5229\u4e8e\u68c0\u7d22\u7684\u8868\u8ff0\uff0c\u518d\u6267\u884c\u68c0\u7d22\uff0c\u63d0\u9ad8\u547d\u4e2d\u7387\u3002

    \u8f93\u51fa\u601d\u8003\uff1a\u5f00\u542f\u540e\uff0c\u6a21\u578b\u5728\u751f\u6210\u6700\u7ec8\u7b54\u6848\u524d\uff0c\u4f1a\u5148\u8f93\u51fa\u4e00\u6bb5\u7f6e\u4e8e\u6807\u7b7e\u5185\u7684\u63a8\u7406\u8fc7\u7a0b\uff0c\u968f\u540e\u518d\u7ed9\u51fa\u6b63\u5f0f\u56de\u590d\u3002

    \u6ce8\u610f\uff1a\u90e8\u5206\u6a21\u578b\u53ea\u8f93\u51fa\u5355\u6807\u7b7e\uff0c\u65e0\u6cd5\u8fdb\u884c\u5173\u95ed\u63a7\u5236\uff0c\u9700\u5bf9\u6a21\u578b\u8fdb\u884c\u914d\u7f6e\u4f18\u5316\u3002\u5982 DeepSeek-R1-Distill-Qwen-32B\u3002

    "},{"location":"user_manual/app/workflow_app/","title":"\u9ad8\u7ea7\u7f16\u6392\u5e94\u7528","text":"

    \u70b9\u51fb\u3010\u521b\u5efa\u3011\uff0c\u9009\u62e9\u3010\u9ad8\u7ea7\u7f16\u6392\u3011\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u6c42\u9009\u62e9\u6a21\u677f\uff0c\u70b9\u51fb\u3010\u521b\u5efa\u3011\u8fdb\u5165\u5de5\u4f5c\u6d41\u7f16\u6392\u9875\u9762\u3002

    \u9ad8\u7ea7\u7f16\u6392\u5e94\u7528\u901a\u8fc7\u53ef\u89c6\u5316\u5de5\u4f5c\u6d41\uff0c\u5c06 AI \u6a21\u578b\u3001\u77e5\u8bc6\u5e93\u3001\u4e1a\u52a1\u903b\u8f91\u3001\u5916\u90e8\u5de5\u5177\u7b49\u8282\u70b9\u81ea\u7531\u7ec4\u5408\uff0c\u8fdb\u884c\u8c03\u8bd5\u4e0e\u53d1\u5e03\u3002

    \u6ce8\u610f\uff1a

    • \u753b\u5e03\u4e0a\u7684\u8282\u70b9\u5fc5\u987b\u5728\u5de5\u4f5c\u6d41\u7a0b\u4e2d\uff0c\u4e0d\u80fd\u6709\u6d41\u7a0b\u5916\u7684\u5b64\u7acb\u8282\u70b9\uff0c\u5426\u5219\u5728\u53d1\u5e03\u65f6\u4f1a\u6821\u9a8c\u5931\u8d25\u3002
    • \u6bcf\u4e2a\u8282\u70b9\u53ef\u4ee5\u6839\u636e\u8282\u70b9\u7684\u7528\u9014\u8fdb\u884c\u91cd\u547d\u540d\uff0c\u53cc\u51fb\u8282\u70b9\u540d\u79f0\u5373\u53ef\u91cd\u547d\u540d\uff0c\u4f46\u540c\u4e00\u4e2a\u5de5\u4f5c\u6d41\u7f16\u6392\u4e2d\u8282\u70b9\u540d\u79f0\u4e0d\u80fd\u91cd\u590d\u3002
    • \u8fde\u7ebf\u7684\u540e\u7f6e\u8282\u70b9\u53ef\u4ee5\u5f15\u7528\u524d\u7f6e\u8282\u70b9\u7684\u8f93\u51fa\u53c2\u6570\uff0c\u5982\u679c\u8282\u70b9\u540d\u79f0\u53d8\u66f4\uff0c\u9700\u8981\u91cd\u65b0\u590d\u5236\u53d8\u91cf\uff0c\u53c2\u6570\u5f15\u7528\u65b9\u5f0f\u662f{{\u8282\u70b9\u540d\u79f0.\u53d8\u91cf\u540d\u79f0}}\u3002

    \u5b8c\u6210\u5de5\u4f5c\u6d41\u7a0b\u8bbe\u8ba1\u4e4b\u540e\uff0c\u4f7f\u7528\u5de6\u4e0b\u65b9\u7684\u753b\u5e03\u63a7\u5236\u680f\uff0c\u53ef\u4ee5\u5bf9\u753b\u5e03\u8fdb\u884c\u6574\u4f53\u8c03\u6574\uff0c\u5305\u62ec\u753b\u5e03\u7f29\u653e\u3001\u8282\u70b9\u6536\u7f29\u4ee5\u53ca\u6d41\u7a0b\u4e00\u952e\u4f18\u5316\u3002

    "},{"location":"user_manual/app/workflow_app/#1","title":"1 \u57fa\u7840\u8282\u70b9","text":"

    \u6bcf\u4e2a\u5de5\u4f5c\u6d41\u7531\u3010\u57fa\u672c\u4fe1\u606f\u3011\u4e0e\u3010\u5f00\u59cb\u3011\u4e24\u4e2a\u57fa\u7840\u8282\u70b9\u6784\u6210\uff0c\u4e14\u5747\u4e0d\u53ef\u5220\u9664\u3001\u4e0d\u53ef\u590d\u5236\u3002

    • \u57fa\u672c\u4fe1\u606f\uff1a\u7528\u4e8e\u914d\u7f6e\u5e94\u7528\u7ea7\u5143\u6570\u636e\uff1a\u5e94\u7528\u540d\u79f0\u3001\u5e94\u7528\u63cf\u8ff0\u3001\u5f00\u573a\u767d\u3001\u8bed\u97f3\u5f00\u5173\u7b49\u3002\u6bcf\u4e2a\u5e94\u7528\u4ec5\u5b58\u5728\u4e00\u4e2a\u8be5\u8282\u70b9\u3002
    • \u5f00\u59cb\uff1a\u4f5c\u6d41\u6267\u884c\u7684\u8d77\u70b9\uff0c\u6240\u6709\u540e\u7eed\u8282\u70b9\u5747\u4ece\u6b64\u8282\u70b9\u5f00\u59cb\u6d41\u8f6c\u3002\u6bcf\u4e2a\u5e94\u7528\u4ec5\u5b58\u5728\u4e00\u4e2a\u8be5\u8282\u70b9\u3002
    "},{"location":"user_manual/app/workflow_app/#11","title":"1.1 \u57fa\u672c\u4fe1\u606f","text":"

    \u8282\u70b9\u8bf4\u660e\uff1a\u5de5\u4f5c\u6d41\u7684\u5f00\u59cb\u8282\u70b9\uff0c\u6709\u4e14\u552f\u4e00\uff0c\u4e0d\u80fd\u5220\u9664\u548c\u590d\u5236\uff0c\u95ee\u7b54\u9875\u9762\u8f93\u5165\u7684\u95ee\u9898\u4f1a\u4f5c\u4e3a\u8be5\u8282\u70b9\u7684\u8f93\u51fa\u53c2\u6570 {question}\uff0c \u540e\u7eed\u8282\u70b9\u5982\u9700\u5f15\u7528\u53ef\u4ee5\u590d\u5236\u8f93\u51fa\u53c2\u6570\u6216\u9009\u62e9\u53d8\u91cf\uff1a\u5f00\u59cb\u8282\u70b9->\u7528\u6237\u95ee\u9898\u3002

    \u6587\u4ef6\u4e0a\u4f20\uff1a\u5f00\u542f\u540e\u5e94\u7528\u5c06\u652f\u6301\u5728\u5bf9\u8bdd\u65f6\u4e0a\u4f20\u6587\u6863\u3002

    • \u6587\u6863\uff1aTXT\u3001MD\u3001DOCX\u3001HTML\u3001CSV\u3001XLSX\u3001XLS\u3001PDF\uff1b
    • \u56fe\u7247\uff1aJPG\u3001JPEG\u3001PNG\u3001GIF\uff1b
    • \u97f3\u9891\u6587\u4ef6\uff1aMP3\u3001WAV\u3001OGG\u3001ACC\u3001M4A\uff1b

    \u6bcf\u6b21\u6700\u591a\u4e0a\u4f20 10 \u4e2a\u6587\u4ef6\uff0c\u5355\u4e2a\u6587\u4ef6\u4e0d\u8d85\u8fc7 100 MB\uff0c\u5728\u540e\u7eed\u8282\u70b9\u4e2d\u53ef\u4ee5\u5bf9\u4e0a\u4f20\u540e\u7684\u6587\u4ef6\u8fdb\u884c\u5904\u7406\u3002\u9ed8\u8ba4 3 \u4e2a\u6587\u4ef6\uff0c\u5355\u4e2a\u6587\u4ef6\u4e0d\u8d85\u8fc7 50 MB\u3002

    • \u7528\u6237\u8f93\u5165\uff1a\u5728\u4f1a\u8bdd\u5f00\u59cb\u65f6\uff0c\u9700\u8981\u5728\u7528\u6237\u7aef\u63d0\u4f9b\u7684\u5fc5\u8981\u4fe1\u606f\uff0c\u4f8b\u5982\uff0c\u5c97\u4f4d\u89d2\u8272\u7b49\uff0c\u4ee5\u4fbf\u540e\u7eed\u6d41\u7a0b\u53ef\u4ee5\u6839\u636e\u4e0d\u540c\u8f93\u5165\u8fdb\u884c\u4e0d\u540c\u7684\u6d41\u7a0b\u8bbe\u8ba1\u3002

    • \u63a5\u53e3\u4f20\u53c2\uff1a\u5728\u901a\u8fc7\u5e94\u7528\u516c\u5f00\u8bbf\u95ee\u94fe\u63a5\u65f6\u53ef\u914d\u7f6e\u7684\u53c2\u6570\u3002\u6dfb\u52a0\u63a5\u53e3\u53c2\u6570\u540e\u5c06\u4f1a\u5728\u516c\u5f00\u8bbf\u95ee URL \u81ea\u52a8\u589e\u52a0\u63a5\u53e3\u53c2\u6570\uff0c\u5728\u4e0e\u7b2c\u4e09\u65b9\u7cfb\u7edf\u96c6\u6210\u3002
    • \u4f1a\u8bdd\u53d8\u91cf\uff1a\u53d8\u91cf\u5728\u5f53\u524d\u5bf9\u8bdd\u6d41\u7a0b\u4e2d\u5168\u7a0b\u6709\u6548\uff0c\u7528\u4e8e\u5b9e\u73b0\u8282\u70b9\u95f4\u6570\u636e\u4f20\u9012\u4e0e\u903b\u8f91\u5224\u65ad\u3002
    • \u8bed\u97f3\u8f93\u5165\uff1a\u5f00\u542f\u540e\u5c06\u652f\u6301\u4ee5\u8bed\u97f3\u7684\u65b9\u5f0f\u8fdb\u884c\u95ee\u9898\u7684\u8f93\u5165\uff0c\u9700\u8981\u4f7f\u7528\u8bed\u97f3\u8bc6\u522b\u6a21\u578b\u3002
    • \u8bed\u97f3\u64ad\u653e\uff1a\u5f00\u542f\u540e\u56de\u7b54\u5185\u5bb9\u5c06\u4ee5\u8bed\u97f3\u7684\u65b9\u5f0f\u8fdb\u884c\u64ad\u653e\uff0c\u53ef\u4ee5\u4f7f\u7528\u6d4f\u89c8\u5668\u5185\u7f6e\u7684\u64ad\u653e\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u8bed\u97f3\u5408\u6210\u6a21\u578b\u8fdb\u884c\u64ad\u653e\u3002

    "},{"location":"user_manual/app/workflow_app/#12","title":"1.2 \u5f00\u59cb","text":"

    \u4f5c\u4e3a\u5de5\u4f5c\u6d41\u6267\u884c\u7684\u8d77\u70b9\uff0c\u6240\u6709\u540e\u7eed\u8282\u70b9\u5747\u4ece\u6b64\u8282\u70b9\u5f00\u59cb\u6d41\u8f6c\u3002 \u5168\u5c40\u53d8\u91cf\uff1a

    • \u5f53\u524d\u65f6\u95f4 {time}\uff1a\u5f53\u524d\u5bf9\u8bdd\u7684\u65f6\u95f4\u3002
    • \u5386\u53f2\u804a\u5929\u8bb0\u5f55 {history_context}\uff1a\u5bf9\u8bdd\u7684\u5386\u53f2\u8bb0\u5f55\u3002
    • \u5bf9\u8bddid {chat_id}\uff1a\u5bf9\u8bdd\u6807\u8bc6\u3002

    \u53c2\u6570\u8f93\u51fa\uff1a

    • \u7528\u6237\u95ee\u9898 {question}\uff1a\u5ba2\u6237\u7aef\u8f93\u5165\u7684\u63d0\u95ee\u4fe1\u606f\u3002
    • \u6587\u6863 {document}\uff1a\u5ba2\u6237\u7aef\u4e0a\u4f20\u7684\u6587\u6863\u3002

    \u70b9\u51fb\u753b\u5e03\u53f3\u4e0a\u89d2\u3010\u6dfb\u52a0\u7ec4\u4ef6\u3011\uff0c\u5373\u53ef\u901a\u8fc7\u201c\u70b9\u51fb\u201d\u6216\u201c\u62d6\u62fd\u201d\u65b9\u5f0f\u5c06\u6240\u9700\u8282\u70b9\u52a0\u5165\u5de5\u4f5c\u6d41\u3002\u7ec4\u4ef6\u6309\u529f\u80fd\u5206\u4e3a\u4e09\u5927\u7c7b\uff0c\u5177\u4f53\u8bf4\u660e\u5982\u4e0b\uff1a

    • \u57fa\u7840\u7ec4\u4ef6\uff1a\u8986\u76d6 AI \u80fd\u529b\u3001\u77e5\u8bc6\u5e93\u3001\u4e1a\u52a1\u903b\u8f91\u7b49\u3002
    • \u5de5\u5177\uff1a\u901a\u8fc7\u51fd\u6570\u65b9\u5f0f\u7075\u6d3b\u5904\u7406\u590d\u6742\u9700\u6c42\u3002
    • \u5e94\u7528\uff1a\u4e00\u952e\u5f15\u5165\u5176\u4ed6\u5df2\u53d1\u5e03\u7684\u5e94\u7528\u4f5c\u4e3a\u5b50\u6d41\u7a0b\uff0c\u76f4\u63a5\u590d\u7528\u5176\u95ee\u7b54\u7ed3\u679c\uff0c\u5b9e\u73b0\u5feb\u901f\u62fc\u88c5\u4e0e\u80fd\u529b\u590d\u7528\u3002

    "},{"location":"user_manual/app/workflow_app/#2","title":"2 \u57fa\u672c\u7ec4\u4ef6","text":""},{"location":"user_manual/app/workflow_app/#21-ai","title":"2.1 AI \u80fd\u529b","text":""},{"location":"user_manual/app/workflow_app/#211-ai","title":"2.1.1 AI \u5bf9\u8bdd","text":"

    \u8282\u70b9\u8bf4\u660e\uff1a\u5982\u679c\u5e94\u7528\u9700\u8981\u4e0e AI \u5927\u6a21\u578b\u8fdb\u884c\u5bf9\u8bdd\uff0c\u5219\u9700\u8981\u5728\u7f16\u6392\u4e2d\u6dfb\u52a0 AI \u5bf9\u8bdd\u7ec4\u4ef6\u3002

    \u8282\u70b9\u8bbe\u7f6e\uff1a

    • AI \u6a21\u578b\uff1a\u5927\u8bed\u8a00\u6a21\u578b\u7684\u540d\u79f0\u4ee5\u53ca\u53c2\u6570\u63a7\u5236\u3002
    • \u7cfb\u7edf\u63d0\u793a\u8bcd\uff1a\u5927\u8bed\u8a00\u6a21\u578b\u56de\u7b54\u7684\u89d2\u8272\u6216\u8eab\u4efd\u8bbe\u5b9a\u3002
    • \u7528\u6237\u63d0\u793a\u8bcd\uff1a\u5f15\u5bfc\u6a21\u578b\u751f\u6210\u7279\u5b9a\u8f93\u51fa\u7684\u8be6\u7ec6\u63cf\u8ff0\u3002\u63d0\u793a\u8bcd\u53ef\u4ee5\u5f15\u7528\u524d\u7f6e\u8282\u70b9\u7684\u53c2\u6570\u8f93\u51fa\uff0c\u5982\u53ef\u4ee5\u5f15\u7528\u524d\u7f6e\u77e5\u8bc6\u5e93\u68c0\u7d22\u7684\u68c0\u7d22\u7ed3\u679c\u548c\u5f00\u59cb\u8282\u70b9\u7684\u95ee\u9898\u53d8\u91cf\u3002
    • \u5386\u53f2\u804a\u5929\u8bb0\u5f55\uff1a\u5728\u5f53\u524d\u5bf9\u8bdd\u4e2d\u6709\u5173\u8054\u7684\u5386\u53f2\u4f1a\u8bdd\u5185\u5bb9\u3002\u4f8b\u5982\uff0c\u5386\u53f2\u804a\u5929\u8bb0\u5f55\u4e3a 1\uff0c\u8868\u793a\u5f53\u524d\u95ee\u9898\u4ee5\u53ca\u4e0a\u4e00\u6b21\u7684\u5bf9\u8bdd\u5185\u5bb9\u4e00\u8d77\u8f93\u9001\u7ed9\u5927\u6a21\u578b\u3002

      • \u9009\u62e9\u8282\u70b9\uff1a\u4f1a\u4f7f\u7528\u5f53\u524d AI \u5bf9\u8bdd\u8282\u70b9\u7684\u63d0\u793a\u8bcd\u4fe1\u606f\u548c\u8282\u70b9\u8fd4\u56de\u7684\u5185\u5bb9\u4f5c\u4e3a\u4e0a\u4e0b\u6587\uff1b
      • \u9009\u62e9\u5de5\u4f5c\u6d41\uff1a\u4f1a\u4f7f\u7528\u5bf9\u8bdd\u6846\u4e2d\u7528\u6237\u8f93\u5165\u7684\u95ee\u9898\u548c\u6700\u7ec8\u56de\u590d\u7684\u5185\u5bb9\u505a\u4e3a\u4e0a\u4e0b\u6587\u3002
    • MCP\uff1a\u652f\u6301\u6dfb\u52a0\u591a\u4e2a MCP\uff0c\u901a\u8fc7\u5f15\u7528 MCP \u548c\u81ea\u5b9a\u4e49 MCP Server Config \u914d\u7f6e\u4e24\u79cd\u65b9\u5f0f\u5b9e\u73b0\u5bf9 MCP \u7684\u8c03\u7528\uff0c\u5927\u6a21\u578b\u4f1a\u6839\u636e\u63d0\u793a\u8bcd\u5185\u5bb9\u4f1a\u4e3b\u52a8\u8c03\u7528\u5408\u9002\u7684\u5de5\u5177\u3002

    • \u5de5\u5177\uff1a\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u573a\u666f\u7075\u6d3b\u9009\u7528\u81ea\u5b9a\u4e49\u5de5\u5177\uff0c\u7cfb\u7edf\u81ea\u52a8\u5c06\u5de5\u5177\u80fd\u529b\u5c01\u88c5\u4e3aMCP\u670d\u52a1\u5e76\u5bf9\u63a5\u6a21\u578b\uff0cAI\u80fd\u591f\u6839\u636e\u5bf9\u8bdd\u4e0a\u4e0b\u6587\u667a\u80fd\u5224\u65ad\u662f\u5426\u8c03\u7528\u5de5\u5177\u3002
    • \u8f93\u51fa MCP/\u5de5\u5177\u6267\u884c\u8fc7\u7a0b\uff1a\u5f00\u542f\u540e\uff0c\u6a21\u578b\u5728\u751f\u6210\u6700\u7ec8\u7b54\u6848\u524d\uff0c\u4f1a\u5148\u8f93\u51fa\u4e00\u6bb5\u7f6e\u4e8e\u6807\u7b7e\u5185\u7684\u63a8\u7406\u8fc7\u7a0b\uff0c\u968f\u540e\u518d\u7ed9\u51fa\u6b63\u5f0f\u56de\u590d\u3002
    • \u8f93\u51fa\u601d\u8003\uff1a\u5bf9\u4e8e\u6a21\u578b\u53cd\u9988\u601d\u8003\u8fc7\u7a0b\u7684\u8bbe\u7f6e\u4e0e\u5f00\u542f\uff0c\u9ed8\u8ba4\u5f00\u59cb\u548c\u7ed3\u675f\u6807\u7b7e\u662f <think>\u3001</think> \u3002
    • \u8fd4\u56de\u5185\u5bb9\uff1a\u662f\u5426\u5728\u5bf9\u8bdd\u4e2d\u663e\u793a\u8be5\u8282\u70b9\u8fd4\u56de\u7684\u5185\u5bb9\u3002

    \u53c2\u6570\u8f93\u51fa\uff1a

    • \u56de\u7b54\u5185\u5bb9 {answer}\uff1a\u6839\u636e\u89d2\u8272\u3001\u63d0\u793a\u8bcd\u7b49\u5185\u5bb9\u5927\u8bed\u8a00\u6a21\u578b\u8fd4\u56de\u7684\u5185\u5bb9\u3002
    • \u601d\u8003\u8fc7\u7a0b {reasoning_content}\uff1aAI \u6a21\u578b\u7684\u601d\u8003\u8fc7\u7a0b\u3002

    \u6ce8\u610f\uff1aMCP \u5de5\u5177\u7684\u8c03\u7528\u9700\u8981\u5927\u8bed\u8a00\u6a21\u578b\u652f\u6301\u51fd\u6570\u8c03\u7528\uff0c\u5982\u679c\u5927\u8bed\u8a00\u6a21\u578b\u4e0d\u652f\u6301\uff0c\u5219\u914d\u7f6e\u65e0\u6548\u3002

    \u63d0\u793a\u8bcd\u662f\u5728\u6bcf\u6b21\u5bf9\u8bdd\u5f00\u59cb\u65f6\u56fa\u5b9a\u6ce8\u5165\u7684\u4e0a\u4e0b\u6587\u6307\u4ee4\uff0c\u7528\u4e8e\u4e3a\u6a21\u578b\u786e\u7acb\u8eab\u4efd\u3001\u8bed\u6c14\u3001\u77e5\u8bc6\u8fb9\u754c\u53ca\u8f93\u51fa\u683c\u5f0f\u7b49\u524d\u7f6e\u89c4\u5219\uff0c\u4ece\u800c\u786e\u4fdd\u56de\u590d\u7cbe\u51c6\u3001\u98ce\u683c\u4e00\u81f4\u4e14\u53ef\u63a7\u3002

    • \u53d8\u91cf\u652f\u6301\uff1a\u5982 {data} \u81ea\u52a8\u63d2\u5165\u77e5\u8bc6\u5e93\u7247\u6bb5\uff0c{question} \u5f15\u7528\u7528\u6237\u95ee\u9898\uff0c\u5b9e\u73b0\u7cbe\u51c6\u3001\u53ef\u63a7\u3001\u4f4e\u5e7b\u89c9\u7684\u667a\u80fd\u56de\u590d\u3002

    \u901a\u8fc7\u5408\u7406\u7f16\u6392\u63d0\u793a\u8bcd\uff0c\u7ba1\u7406\u5458\u53ef\u5728\u4e0d\u66f4\u6362\u6a21\u578b\u7684\u524d\u63d0\u4e0b\uff0c\u5b9e\u73b0\u591a\u573a\u666f\u3001\u591a\u89d2\u8272\u7684\u5feb\u901f\u5207\u6362\uff0c\u663e\u8457\u964d\u4f4e\u5927\u6a21\u578b\u5e7b\u89c9\u98ce\u9669\u5e76\u63d0\u5347\u7528\u6237\u4f53\u9a8c\u3002

    AI \u5bf9\u8bdd\u8282\u70b9\u652f\u6301\u57fa\u4e8e\u7528\u6237\u8f93\u5165\u7684\u4e3b\u9898\u5185\u5bb9\uff0c\u81ea\u52a8\u751f\u6210\u9ad8\u8d28\u91cf\u3001\u7ed3\u6784\u5b8c\u6574\u7684\u7cfb\u7edf\u63d0\u793a\u8bcd\uff0c\u8f85\u52a9\u7528\u6237\u5feb\u901f\u6784\u5efa\u9002\u7528\u4e8e\u5f53\u524d\u573a\u666f\u7684\u63d0\u793a\u6587\u672c\u3002

    MCP\uff1a\u5f15\u7528 MCP\u548c\u81ea\u5b9a\u4e49 MCP Server Config\u3002

    \u5de5\u5177\uff1a\u652f\u6301\u6dfb\u52a0\u3010\u5de5\u5177\u3011\u4e2d\u5df2\u542f\u7528\u7684\u5de5\u5177\u3002

    "},{"location":"user_manual/app/workflow_app/#212","title":"2.1.2 \u610f\u56fe\u8bc6\u522b","text":"

    \u8282\u70b9\u8bf4\u660e\uff1a\u6839\u636e\u8f93\u5165\u8fdb\u884c\u610f\u56fe\u7684\u5206\u7c7b\u8bc6\u522b\u3002

    \u8282\u70b9\u8bbe\u7f6e\uff1a

    • AI \u6a21\u578b\uff1a\u5927\u8bed\u8a00\u6a21\u578b\u7684\u540d\u79f0\u4ee5\u53ca\u53c2\u6570\u63a7\u5236\u3002
    • \u8f93\u5165\uff1a\u5f85\u8fdb\u884c\u610f\u56fe\u8bc6\u522b\u7684\u5185\u5bb9\u3002
    • \u5386\u53f2\u804a\u5929\u8bb0\u5f55\uff1a\u5728\u5f53\u524d\u5bf9\u8bdd\u4e2d\u6709\u5173\u8054\u7684\u5386\u53f2\u4f1a\u8bdd\u5185\u5bb9\u3002\u4f8b\u5982\uff0c\u5386\u53f2\u804a\u5929\u8bb0\u5f55\u4e3a 1\uff0c\u8868\u793a\u5f53\u524d\u95ee\u9898\u4ee5\u53ca\u4e0a\u4e00\u6b21\u7684\u5bf9\u8bdd\u5185\u5bb9\u4e00\u8d77\u8f93\u9001\u7ed9\u5927\u6a21\u578b\u3002
    • \u610f\u56fe\u5206\u7c7b\uff1a\u6bcf\u4e2a\u610f\u56fe\u5206\u7c7b\u7684\u540d\u79f0\u3002

    \u53c2\u6570\u8f93\u51fa\uff1a

    • \u5206\u7c7b {category}\uff1a\u6839\u636e\u610f\u56fe\u5206\u7c7b\u7684\u7c7b\u578b\uff0c\u8fd4\u56de\u5206\u7c7b\u540d\u79f0\u3002
    • \u7406\u7531 {reason}\uff1a\u5224\u65ad\u610f\u56fe\u5206\u7c7b\u7684\u7406\u7531\u3002

    "},{"location":"user_manual/app/workflow_app/#213","title":"2.1.3 \u56fe\u7247\u751f\u6210","text":"

    \u8282\u70b9\u8bf4\u660e\uff1a\u6839\u636e\u6587\u672c\u63cf\u8ff0\u751f\u6210\u5bf9\u5e94\u7684\u56fe\u7247\u3002

    \u8282\u70b9\u8bbe\u7f6e\uff1a

    • \u56fe\u7247\u751f\u6210\u6a21\u578b\uff1a\u56fe\u7247\u751f\u6210\u6a21\u578b\u540d\u79f0\u3002
    • \u63d0\u793a\u8bcd\uff08\u6b63\u5411\uff09\uff1a\u5f15\u5bfc\u6a21\u578b\u751f\u6210\u79ef\u6781\u3001\u5efa\u8bbe\u6027\u8f93\u51fa\u7684\u6587\u5b57\u8f93\u5165\u3002
    • \u63d0\u793a\u8bcd\uff08\u8d1f\u5411\uff09\uff1a\u4e0d\u5e94\u8be5\u5305\u542b\u5728\u751f\u6210\u8f93\u51fa\u4e2d\u7684\u5143\u7d20\u3001\u4e3b\u9898\u6216\u7279\u5f81\u7684\u63cf\u8ff0\u3002
    • \u8fd4\u56de\u5185\u5bb9\uff1a\u662f\u5426\u5728\u5bf9\u8bdd\u4e2d\u663e\u793a\u8be5\u8282\u70b9\u8fd4\u56de\u7684\u5185\u5bb9\u3002

    \u53c2\u6570\u8f93\u51fa\uff1a

    • AI \u56de\u7b54\u5185\u5bb9 {answer}\uff1a\u5373\u56fe\u7247\u751f\u6210\u6a21\u578b\u6839\u636e\u6587\u672c\u8f93\u5165\u751f\u6210\u7684\u56fe\u7247\u3002
    • \u56fe\u7247 {image}: \u751f\u6210\u56fe\u7247\u7684\u8be6\u7ec6\u4fe1\u606f\u3002

    "},{"location":"user_manual/app/workflow_app/#214","title":"2.1.4 \u56fe\u7247\u7406\u89e3","text":"

    \u8282\u70b9\u8bf4\u660e\uff1a\u5bf9\u7528\u6237\u4e0a\u4f20\u7684\u56fe\u7247\u6587\u4ef6\u8fdb\u884c\u5206\u6790\u548c\u7406\u89e3\u3002

    \u8282\u70b9\u8bbe\u7f6e\uff1a

    • \u56fe\u7247\u7406\u89e3\u6a21\u578b\uff1a\u56fe\u7247\u7406\u89e3\u6a21\u578b\u540d\u79f0\u3002
    • \u89d2\u8272\u8bbe\u5b9a\uff1a\u56de\u7b54\u7684\u89d2\u8272\u6216\u8eab\u4efd\u8bbe\u5b9a\u3002
    • \u63d0\u793a\u8bcd\uff1a\u5f15\u5bfc\u6a21\u578b\u751f\u6210\u7279\u5b9a\u8f93\u51fa\u7684\u8be6\u7ec6\u63cf\u8ff0\u3002
    • \u5386\u53f2\u804a\u5929\u8bb0\u5f55\uff1a\u5728\u5f53\u524d\u5bf9\u8bdd\u4e2d\u6709\u5173\u8054\u7684\u5386\u53f2\u4f1a\u8bdd\u5185\u5bb9\u3002

      • \u9009\u62e9\u8282\u70b9\uff1a\u4f1a\u4f7f\u7528\u5f53\u524d\u56fe\u7247\u7406\u89e3\u8282\u70b9\u7684\u63d0\u793a\u8bcd\u4fe1\u606f\u548c\u8282\u70b9\u8fd4\u56de\u7684\u5185\u5bb9\u4f5c\u4e3a\u4e0a\u4e0b\u6587\uff1b
      • \u9009\u62e9\u5de5\u4f5c\u6d41\uff1a\u4f1a\u4f7f\u7528\u5bf9\u8bdd\u6846\u4e2d\u7528\u6237\u8f93\u5165\u7684\u95ee\u9898\u548c\u6700\u7ec8\u56de\u590d\u7684\u5185\u5bb9\u505a\u4e3a\u4e0a\u4e0b\u6587\u3002
    • \u9009\u62e9\u56fe\u7247\uff1a\u5f85\u7406\u89e3\u548c\u5206\u6790\u7684\u56fe\u7247\uff0c\u9ed8\u8ba4\u4e3a\u5f53\u524d\u7528\u6237\u4e0a\u4f20\u7684\u56fe\u7247\u6587\u4ef6\u3002

    • \u8fd4\u56de\u5185\u5bb9\uff1a\u662f\u5426\u5728\u5bf9\u8bdd\u4e2d\u663e\u793a\u8be5\u8282\u70b9\u8fd4\u56de\u7684\u5185\u5bb9\u3002

    \u53c2\u6570\u8f93\u51fa\uff1a

    • AI \u56de\u7b54\u5185\u5bb9{answer}\uff1a\u6839\u636e\u4e0a\u4f20\u7684\u56fe\u7247\u4ee5\u53ca\u89d2\u8272\u3001\u63d0\u793a\u8bcd\u7b49\u4fe1\u606f\u56fe\u7247\u7406\u89e3\u6a21\u578b\u8fd4\u56de\u7684\u5185\u5bb9\u3002

    "},{"location":"user_manual/app/workflow_app/#215","title":"2.1.5 \u6587\u672c\u8f6c\u8bed\u97f3","text":"

    \u8282\u70b9\u8bf4\u660e\uff1a\u5c06\u6587\u672c\u8f6c\u6362\u4e3a\u97f3\u9891\u3002

    \u8282\u70b9\u8bbe\u7f6e\uff1a

    • \u8bed\u97f3\u5408\u6210\u6a21\u578b\uff1a\u9009\u62e9\u53ef\u7528\u8bed\u97f3\u5408\u6210\u6a21\u578b\u7684\u540d\u79f0\u3002
    • \u6587\u672c\u5185\u5bb9\uff1a\u9009\u62e9\u5f85\u5408\u6210\u7684\u6587\u672c\u5185\u5bb9\u3002
    • \u8fd4\u56de\u5185\u5bb9\uff1a\u662f\u5426\u5728\u5bf9\u8bdd\u4e2d\u663e\u793a\u8be5\u8282\u70b9\u8fd4\u56de\u7684\u5185\u5bb9\u3002

    \u53c2\u6570\u8f93\u51fa\uff1a

    • \u7ed3\u679c {result}\uff1a\u5c06\u6587\u672c\u8f6c\u6210\u7684\u97f3\u9891\u5185\u5bb9\u3002

    "},{"location":"user_manual/app/workflow_app/#216","title":"2.1.6 \u8bed\u97f3\u8f6c\u6587\u672c","text":"

    \u8282\u70b9\u8bf4\u660e\uff1a\u5c06\u97f3\u9891\u6587\u4ef6\u8f6c\u6362\u4e3a\u6587\u672c\u3002

    \u8282\u70b9\u8bbe\u7f6e\uff1a

    • \u8bed\u97f3\u8bc6\u522b\u6a21\u578b\uff1a\u9009\u62e9\u8bed\u97f3\u8bc6\u522b\u6a21\u578b\u7684\u540d\u79f0\u3002
    • \u8bed\u97f3\u6587\u4ef6\uff1a\u5373\u4e0a\u4f20\u7684\u97f3\u9891\u6587\u4ef6\uff0c\u652f\u6301\u7684\u683c\u5f0f\u5305\u62ec\uff1amp3\u3001wav\u3001ogg\u3001acc\u3002
    • \u8fd4\u56de\u5185\u5bb9\uff1a\u662f\u5426\u5728\u5bf9\u8bdd\u4e2d\u663e\u793a\u8be5\u8282\u70b9\u8fd4\u56de\u7684\u5185\u5bb9\u3002

    \u53c2\u6570\u8f93\u51fa\uff1a

    • \u7ed3\u679c {result}\uff1a\u8bed\u97f3\u8f6c\u6362\u540e\u7684\u6587\u672c\u5185\u5bb9\u3002

    "},{"location":"user_manual/app/workflow_app/#217","title":"2.1.7 \u6587\u751f\u89c6\u9891","text":"

    \u8282\u70b9\u8bf4\u660e\uff1a\u6839\u636e\u6587\u672c\u63cf\u8ff0\u751f\u6210\u5bf9\u5e94\u7684\u89c6\u9891\u3002

    \u8282\u70b9\u8bbe\u7f6e\uff1a

    • \u6587\u751f\u89c6\u9891\u6a21\u578b\uff1a\u9009\u62e9\u6587\u751f\u89c6\u9891\u6a21\u578b\u540d\u79f0\u3002
    • \u63d0\u793a\u8bcd\uff08\u6b63\u5411\uff09\uff1a\u5f15\u5bfc\u6a21\u578b\u751f\u6210\u79ef\u6781\u3001\u5efa\u8bbe\u6027\u8f93\u51fa\u7684\u6587\u5b57\u8f93\u5165\u3002
    • \u63d0\u793a\u8bcd\uff08\u8d1f\u5411\uff09\uff1a\u4e0d\u5e94\u8be5\u5305\u542b\u5728\u751f\u6210\u8f93\u51fa\u4e2d\u7684\u5143\u7d20\u3001\u4e3b\u9898\u6216\u7279\u5f81\u7684\u63cf\u8ff0\u3002
    • \u8fd4\u56de\u5185\u5bb9\uff1a\u662f\u5426\u5728\u5bf9\u8bdd\u4e2d\u663e\u793a\u8be5\u8282\u70b9\u8fd4\u56de\u7684\u5185\u5bb9\u3002

    \u53c2\u6570\u8f93\u51fa\uff1a

    • \u89c6\u9891 {video}\uff1a\u6839\u636e\u6587\u672c\u751f\u6210\u7684\u89c6\u9891\u5185\u5bb9\u3002

    "},{"location":"user_manual/app/workflow_app/#218","title":"2.1.8 \u56fe\u751f\u89c6\u9891","text":"

    \u8282\u70b9\u8bf4\u660e\uff1a\u6839\u636e\u56fe\u7247\u751f\u6210\u5bf9\u5e94\u7684\u89c6\u9891\u3002

    \u8282\u70b9\u8bbe\u7f6e\uff1a

    • \u56fe\u751f\u89c6\u9891\u6a21\u578b\uff1a\u9009\u62e9\u56fe\u751f\u89c6\u9891\u6a21\u578b\u540d\u79f0\u3002
    • \u63d0\u793a\u8bcd\uff08\u6b63\u5411\uff09\uff1a\u5f15\u5bfc\u6a21\u578b\u751f\u6210\u79ef\u6781\u3001\u5efa\u8bbe\u6027\u8f93\u51fa\u7684\u6587\u5b57\u8f93\u5165\u3002
    • \u63d0\u793a\u8bcd\uff08\u8d1f\u5411\uff09\uff1a\u4e0d\u5e94\u8be5\u5305\u542b\u5728\u751f\u6210\u8f93\u51fa\u4e2d\u7684\u5143\u7d20\u3001\u4e3b\u9898\u6216\u7279\u5f81\u7684\u63cf\u8ff0\u3002
    • \u9996\u5e27\u56fe\u7247\uff1a\u5fc5\u586b\uff0c\u5f85\u751f\u6210\u89c6\u9891\u7684\u56fe\u7247\uff0c\u9009\u62e9\u5f00\u59cb\u4e2d\u7528\u6237\u4e0a\u4f20\u7684\u56fe\u7247\u6587\u4ef6\u3002
    • \u5c3e\u5e27\u56fe\u7247\uff1a\u975e\u5fc5\u586b\uff0c\u56fe\u751f\u89c6\u9891\u5c3e\u5e27\u7684\u56fe\u7247\uff0c\u53ef\u4ee5\u89c4\u8303\u89c6\u9891\u7684\u751f\u6210
    • \u8fd4\u56de\u5185\u5bb9\uff1a\u662f\u5426\u5728\u5bf9\u8bdd\u4e2d\u663e\u793a\u8be5\u8282\u70b9\u8fd4\u56de\u7684\u5185\u5bb9\u3002

    \u53c2\u6570\u8f93\u51fa\uff1a

    • \u89c6\u9891 {video}\uff1a\u6839\u636e\u56fe\u7247\u751f\u6210\u7684\u89c6\u9891\u5185\u5bb9\u3002

    "},{"location":"user_manual/app/workflow_app/#219","title":"2.1.9 \u95ee\u9898\u4f18\u5316","text":"

    \u8282\u70b9\u8bf4\u660e\uff1a\u6839\u636e\u5f53\u524d\u4f1a\u8bdd\u7684\u5386\u53f2\u804a\u5929\u8bb0\u5f55\uff0c\u4ee5\u53ca\u5728\u8282\u70b9\u8bbe\u7f6e\u7684\u5927\u9884\u8a00\u6a21\u578b\u548c\u63d0\u793a\u8bcd\uff0c\u5bf9\u5f53\u524d\u95ee\u9898\u8fdb\u884c\u667a\u80fd\u4f18\u5316\u3002

    \u8282\u70b9\u8bbe\u7f6e\uff1a

    • AI \u6a21\u578b\uff1a\u5927\u8bed\u8a00\u6a21\u578b\u7684\u540d\u79f0\u4ee5\u53ca\u53c2\u6570\u63a7\u5236\u3002
    • \u89d2\u8272\u8bbe\u5b9a\uff1a\u5927\u8bed\u8a00\u6a21\u578b\u56de\u7b54\u7684\u89d2\u8272\u6216\u8eab\u4efd\u8bbe\u5b9a\u3002
    • \u63d0\u793a\u8bcd\uff1a\u5f15\u5bfc\u6a21\u578b\u751f\u6210\u7279\u5b9a\u8f93\u51fa\u7684\u8be6\u7ec6\u63cf\u8ff0\u3002
    • \u5386\u53f2\u804a\u5929\u8bb0\u5f55\uff1a\u5728\u5f53\u524d\u5bf9\u8bdd\u4e2d\u6709\u5173\u8054\u7684\u5386\u53f2\u4f1a\u8bdd\u5185\u5bb9\u3002\u4f8b\u5982\uff0c\u5386\u53f2\u804a\u5929\u8bb0\u5f55\u4e3a 1\uff0c\u8868\u793a\u5f53\u524d\u95ee\u9898\u4ee5\u53ca\u4e0a\u4e00\u6b21\u7684\u5bf9\u8bdd\u5185\u5bb9\u4e00\u8d77\u8f93\u9001\u7ed9\u5927\u6a21\u578b\u3002
    • \u8fd4\u56de\u5185\u5bb9\uff1a\u662f\u5426\u5728\u5bf9\u8bdd\u4e2d\u663e\u793a\u8be5\u8282\u70b9\u8fd4\u56de\u7684\u5185\u5bb9\u3002

    \u53c2\u6570\u8f93\u51fa\uff1a

    • \u95ee\u9898\u4f18\u5316\u7ed3\u679c {answer}\uff1a\u901a\u8fc7\u5927\u6a21\u578b\u4f18\u5316\u540e\u7684\u95ee\u9898\u3002

    "},{"location":"user_manual/app/workflow_app/#22","title":"2.2 \u77e5\u8bc6\u5e93","text":""},{"location":"user_manual/app/workflow_app/#221","title":"2.2.1 \u77e5\u8bc6\u5e93\u68c0\u7d22","text":"

    \u8282\u70b9\u8bf4\u660e\uff1a\u5982\u679c\u5e94\u7528\u9700\u8981\u5173\u8054\u77e5\u8bc6\u5e93\uff0c\u5219\u9700\u8981\u5728\u7f16\u6392\u4e2d\u6dfb\u52a0\u77e5\u8bc6\u5e93\u68c0\u7d22\u8282\u70b9\uff0c\u9009\u62e9\u77e5\u8bc6\u5e93\u3001\u8bbe\u7f6e\u68c0\u7d22\u53c2\u6570\u3001\u9009\u62e9\u68c0\u7d22\u7684\u95ee\u9898\u3002

    \u8282\u70b9\u8bbe\u7f6e\uff1a

    • \u77e5\u8bc6\u5e93\uff1a\u5f85\u68c0\u7d22\u7684\u77e5\u8bc6\u5e93\u3002
    • \u68c0\u7d22\u53c2\u6570\uff1a\u5305\u62ec\u68c0\u7d22\u6a21\u5f0f\u3001\u76f8\u4f3c\u5ea6\u9608\u503c\u3001\u5f15\u7528\u5206\u6bb5\u6570\u91cf\u4ee5\u53ca\u6700\u5927\u5f15\u7528\u5b57\u7b26\u6570\u3002
    • \u68c0\u7d22\u95ee\u9898\uff1a\u4e00\u822c\u662f\u5f00\u59cb\u8282\u70b9\u7684\u7528\u6237\u95ee\u9898\u3002
    • \u7ed3\u679c\u663e\u793a\u5728\u77e5\u8bc6\u6765\u6e90\u4e2d\uff1a\u9ed8\u8ba4\u5173\u95ed\uff0c\u5f00\u542f\u540e\u53ef\u4ee5\u5728\u56de\u7b54\u7ed3\u679c\u4e2d\u663e\u793a\u77e5\u8bc6\u6765\u6e90\u3002

    \u53c2\u6570\u8f93\u51fa\uff1a

    • \u68c0\u7d22\u7ed3\u679c\u7684\u5206\u6bb5\u5217\u8868 {paragraph_list}\uff1a\u6570\u7ec4\u7c7b\u578b\uff0c\u6307\u6839\u636e\u68c0\u7d22\u95ee\u9898\u3001\u68c0\u7d22\u53c2\u6570\u8fdb\u884c\u68c0\u7d22\u540e\u547d\u4e2d\u7684\u5206\u6bb5\u5217\u8868\uff0c\u5305\u542b\u4e86\u5206\u6bb5\u7684\u6240\u6709\u5c5e\u6027\uff1b
    • \u6ee1\u8db3\u76f4\u63a5\u56de\u7b54\u7684\u5206\u6bb5\u5217\u8868 {is_hit_handling_method_list}\uff1a\u6570\u7ec4\u7c7b\u578b\uff0c\u6307\u6839\u636e\u68c0\u7d22\u95ee\u9898\u3001\u68c0\u7d22\u53c2\u6570\u8fdb\u884c\u68c0\u7d22\u540e\u547d\u4e2d\u7684\u5206\u6bb5\u4e2d\u6ee1\u8db3\u76f4\u63a5\u56de\u7b54\u7684\u6240\u6709\u5206\u6bb5\u5217\u8868\uff0c\u5305\u542b\u4e86\u5206\u6bb5\u7684\u6240\u6709\u5c5e\u6027\uff1b
    • \u68c0\u7d22\u7ed3\u679c {data}\uff1a\u5b57\u7b26\u4e32\u7c7b\u578b\uff0c\u6307\u6839\u636e\u68c0\u7d22\u95ee\u9898\u3001\u68c0\u7d22\u53c2\u6570\u8fdb\u884c\u68c0\u7d22\u540e\u547d\u4e2d\u7684\u5206\u6bb5\u5185\u5bb9\uff1b
    • \u6ee1\u8db3\u76f4\u63a5\u56de\u7b54\u7684\u5206\u6bb5\u5185\u5bb9 {directly_return}\uff1a\u5b57\u7b26\u4e32\u7c7b\u578b\uff0c\u6307\u6839\u636e\u68c0\u7d22\u95ee\u9898\u3001\u68c0\u7d22\u53c2\u6570\u8fdb\u884c\u68c0\u7d22\u540e\u547d\u4e2d\u7684\u5206\u6bb5\u4e2d\u6ee1\u8db3\u76f4\u63a5\u56de\u7b54\u7684\u6240\u6709\u5206\u6bb5\u5185\u5bb9\u3002

    "},{"location":"user_manual/app/workflow_app/#222","title":"2.2.2 \u591a\u8def\u53ec\u56de","text":"

    \u8282\u70b9\u8bf4\u660e\uff1a\u6839\u636e\u9700\u8981\u91cd\u6392\u7684\u5185\u5bb9\u3001\u68c0\u7d22\u95ee\u9898\u4ee5\u53ca\u68c0\u7d22\u53c2\u6570\u8fdb\u884c\u591a\u8def\u53ec\u56de\u3002

    \u8282\u70b9\u8bbe\u7f6e\uff1a

    • \u91cd\u6392\u5185\u5bb9\uff1a\u5f85\u91cd\u6392\u7684\u591a\u4e2a\u5185\u5bb9\uff0c\u4e00\u822c\u662f\u591a\u4e2a\u4e0d\u540c\u77e5\u8bc6\u5e93\u7684\u68c0\u7d22\u7ed3\u679c\u3002
    • \u68c0\u7d22\u53c2\u6570\uff1a\u5305\u62ec score \u9608\u503c\u3001\u5f15\u7528\u5206\u6bb5\u6570\u4ee5\u53ca\u6700\u5927\u5f15\u7528\u5b57\u7b26\u6570\u3002
    • \u68c0\u7d22\u95ee\u9898\uff1a\u6839\u636e\u68c0\u7d22\u95ee\u9898\u8fdb\u884c\u91cd\u6392\uff0c\u4e00\u822c\u4e3a\u7528\u6237\u95ee\u9898\u6216\u95ee\u9898\u4f18\u5316\u540e\u7684\u7ed3\u679c\u3002
    • \u91cd\u6392\u6a21\u578b\uff1a\u9700\u8981\u4f7f\u7528\u7684\u91cd\u6392\u6a21\u578b\u540d\u79f0\u3002

    \u53c2\u6570\u8f93\u51fa\uff1a

    • \u91cd\u6392\u7ed3\u679c\u5217\u8868 {result_list}\uff1a\u6570\u7ec4\u7c7b\u578b\uff0c\u6307\u6839\u636e\u91cd\u6392\u540e\u7684\u7ed3\u679c\u5217\u8868\u3002
    • \u91cd\u6392\u7ed3\u679c {result}\uff1a\u5b57\u7b26\u4e32\u7c7b\u578b\uff0c\u6307\u6839\u636e\u68c0\u7d22\u53c2\u6570\u540e\u7684\u91cd\u6392\u7ed3\u679c\u3002

    "},{"location":"user_manual/app/workflow_app/#23","title":"2.3 \u4e1a\u52a1\u903b\u8f91","text":""},{"location":"user_manual/app/workflow_app/#231","title":"2.3.1 \u5224\u65ad\u5668","text":"

    \u8282\u70b9\u8bf4\u660e\uff1a\u6839\u636e\u4e0d\u540c\u7684\u6761\u4ef6\u8fdb\u884c\u903b\u8f91\u5224\u65ad\uff0c\u6bcf\u4e2a\u5224\u65ad\u5206\u652f\u540e\u9762\u5fc5\u987b\u6709\u540e\u7f6e\u6267\u884c\u8282\u70b9\u3002

    \u5224\u65ad\u5668\u8282\u70b9\u8f93\u51fa\u53c2\u6570\u8bf4\u660e\uff1a

    • \u5206\u652f\u540d\u79f0{branch_name}\uff1a\u6bcf\u4e2a\u5224\u65ad\u5206\u652f\u7684\u540d\u79f0\u3002

    "},{"location":"user_manual/app/workflow_app/#232","title":"2.3.2 \u8868\u5355\u6536\u96c6","text":"

    \u8282\u70b9\u8bf4\u660e\uff1a\u901a\u8fc7\u8868\u5355\u7684\u8bbe\u8ba1\uff0c\u4ee5\u5f15\u5bfc\u7684\u65b9\u5f0f\u4e3b\u52a8\u83b7\u53d6\u5fc5\u8981\u7684\u4fe1\u606f\uff0c\u4e00\u822c\u5e94\u7528\u4e8e\u9700\u8981\u591a\u6b21\u8be2\u95ee\u7684\u5e94\u7b54\u573a\u666f\u3002

    \u8282\u70b9\u8bbe\u7f6e\uff1a

    • \u8868\u5355\u8f93\u51fa\u5185\u5bb9\uff1a\u8868\u5355\u63d0\u793a\u8bf4\u660e\u4ee5\u53ca\u8868\u5355\u5185\u5bb9\uff0c\u53ef\u4ee5\u5355\u9879\u8f93\u5165\uff0c\u4e5f\u53ef\u4ee5\u8f93\u5165\u591a\u9879\u4fe1\u606f\u3002
    • \u8868\u5355\u914d\u7f6e\uff1a\u901a\u8fc7\u6dfb\u52a0\u4e0d\u540c\u7684\u7ec4\u4ef6\u8fdb\u884c\u8868\u5355\u7684\u8bbe\u8ba1\u3002

    \u53c2\u6570\u8f93\u51fa\uff1a

    • \u8868\u5355\u5168\u90e8\u5185\u5bb9{form_data}\uff1a\u8868\u5355\u7684\u5168\u90e8\u5185\u5bb9\u3002

    \u8868\u5355\u5168\u90e8\u5185\u5bb9\u5c06\u4f5c\u4e3a\u56fa\u5b9a\u7684\u8f93\u51fa\uff0c\u5bf9\u4e8e\u5404\u4e2a\u8868\u5355\u9879\u4e5f\u90fd\u8fdb\u884c\u53c2\u6570\u5316\u8f93\u51fa\u3002

    \u8868\u5355\u6dfb\u52a0\u53c2\u6570\u7684\u7ec4\u4ef6\u7c7b\u578b\u652f\u6301\u6587\u672c\u6846\u3001\u591a\u884c\u6587\u672c\u6846\u3001JSON \u6587\u672c\u6846\u3001\u5bc6\u7801\u6846\u3001\u5355\u9009\u6846\u3001\u591a\u9009\u6846\u3001\u9009\u9879\u5361\u3001\u5355\u884c\u9009\u9879\u5361\u3001\u5355\u884c\u591a\u9009\u5361\u3001\u6ed1\u5757\u3001\u5f00\u5173\u3001\u65e5\u671f\u548c\u6587\u4ef6\u4e0a\u4f20\u3002

    \u8868\u5355\u53c2\u6570\u652f\u6301\u5f15\u7528\u53d8\u91cf\u6216\u53c2\u6570\u8f93\u5165:

    • \u7ec4\u4ef6\u7c7b\u578b\u4e3a\u3010\u5355\u9009\u6846\u3001\u591a\u9009\u6846\u3001\u9009\u9879\u5361\u3001\u5355\u884c\u9009\u9879\u5361\u3001\u5355\u884c\u591a\u9009\u5361\u3001JSON\u6587\u672c\u6846\u3011\u65f6\uff0c\u8d4b\u503c\u65b9\u5f0f\u4e2d\u53ef\u9009\u62e9\u81ea\u5b9a\u4e49\u6216\u5f15\u7528\u53d8\u91cf\uff0c\u9ed8\u8ba4\u4e3a\uff1a\u81ea\u5b9a\u4e49\u3002\u5f15\u7528\u53d8\u91cf\u7684\u683c\u5f0f\u53ef\u53c2\u8003\u3010\u5f15\u7528\u53d8\u91cf\u3011\u65c1\u7684\u63d0\u793a\u4fe1\u606f\u3002

    • \u3010\u6587\u672c\u6846\u3001\u591a\u884c\u6587\u672c\u6846\u3001\u5bc6\u7801\u6846\u3011\u7ec4\u4ef6\u7684\u9ed8\u8ba4\u503c\u652f\u6301\u53c2\u6570\u8f93\u5165\u3002\u53c2\u6570\u683c\u5f0f\u53c2\u8003\uff1a{{\u5f00\u59cb.question}}

    "},{"location":"user_manual/app/workflow_app/#233","title":"2.3.3 \u53d8\u91cf\u8d4b\u503c","text":"

    \u8282\u70b9\u8bf4\u660e\uff1a\u66f4\u65b0\u5168\u5c40\u53d8\u91cf\u7684\u503c\u3002

    "},{"location":"user_manual/app/workflow_app/#234","title":"2.3.4 \u6307\u5b9a\u56de\u590d","text":"

    \u8282\u70b9\u8bf4\u660e\uff1a\u6307\u5b9a\u8f93\u51fa\u6587\u672c\u5185\u5bb9\uff0c\u5728\u77e5\u8bc6\u5e93\u67e5\u8be2\u5230\u7684\u76f8\u5173\u5185\u5bb9\u6ee1\u8db3\u76f4\u63a5\u56de\u7b54\u7684\u8981\u6c42\uff0c\u53ef\u4ee5\u8f93\u51fa\u68c0\u7d22\u5185\u5bb9\uff0c\u4e5f\u53ef\u4ee5\u5728\u77e5\u8bc6\u5e93\u6ca1\u6709\u67e5\u8be2\u5230\u5173\u8054\u5185\u5bb9\u65f6\uff0c\u6307\u5b9a\u56de\u590d\u5185\u5bb9\u3002

    \u8f93\u51fa\u53c2\u6570\uff1a

    • \u5185\u5bb9{answer}\uff1a \u6307\u5b9a\u56de\u590d\u8f93\u51fa\u7684\u5185\u5bb9\u3002

    "},{"location":"user_manual/app/workflow_app/#235","title":"2.3.5 \u5faa\u73af\u8282\u70b9","text":"

    \u8282\u70b9\u8bf4\u660e\uff1a\u901a\u8fc7\u8bbe\u7f6e\u5faa\u73af\u7c7b\u578b\u548c\u5faa\u73af\u4f53\uff0c\u5728\u6ee1\u8db3\u7279\u5b9a\u6761\u4ef6\u524d\u91cd\u590d\u6267\u884c\u4efb\u52a1\u5e8f\u5217\u3002\u6dfb\u52a0\u5faa\u73af\u8282\u70b9\u540e\uff0c\u4f1a\u751f\u6210\u4e00\u4e2a\u5faa\u73af\u8282\u70b9\u548c\u5bf9\u5e94\u7684\u5faa\u73af\u4f53\u753b\u5e03\u3002

    \u5faa\u73af\u7c7b\u578b\uff1a\u5faa\u73af\u7c7b\u578b\u662f\u5faa\u73af\u8282\u70b9\u7684\u8fd0\u884c\u6a21\u5f0f\uff0c\u652f\u6301\u8bbe\u7f6e\u4e3a\u6570\u7ec4\u5faa\u73af\u3001\u6307\u5b9a\u6b21\u6570\u5faa\u73af\u548c\u65e0\u9650\u5faa\u73af\u3002

    • \u6570\u7ec4\u5faa\u73af\uff1a\u57fa\u4e8e\u6570\u7ec4\u6570\u636e\u9a71\u52a8\u5faa\u73af\uff0c\u652f\u6301\u904d\u5386\u6570\u7ec4\u4e2d\u7684\u6bcf\u4e00\u9879\u5143\u7d20\uff0c\u4f9d\u6b21\u6267\u884c\u4efb\u52a1\uff0c\u9002\u7528\u4e8e\u201c\u6309\u6570\u636e\u91cf\u6279\u91cf\u5904\u7406\u201d\u7684\u4f7f\u7528\u573a\u666f\uff1b
      • \u5faa\u73af\u6570\u7ec4\uff1a\u9009\u62e9\u5f85\u8fdb\u884c\u5faa\u73af\u7684\u6570\u7ec4\u5185\u5bb9\u3002
    • \u6307\u5b9a\u6b21\u6570\u5faa\u73af\uff1a\u6309\u9884\u8bbe\u56fa\u5b9a\u6b21\u6570\u6267\u884c\u5faa\u73af\uff0c\u7528\u6237\u53ef\u4ee5\u76f4\u63a5\u8bbe\u7f6e\u4efb\u52a1\u91cd\u590d\u8fd0\u884c\u7684\u5177\u4f53\u6b21\u6570\uff08\u5982\u5faa\u73af 5 \u6b21\u300110 \u6b21\uff09\uff0c\u53ef\u4ee5\u6ee1\u8db3\u201c\u660e\u786e\u6b21\u6570\u7684\u91cd\u590d\u64cd\u4f5c\u201d\u7684\u4f7f\u7528\u9700\u6c42\uff1b
      • \u5faa\u73af\u6b21\u6570\uff1a\u8bbe\u7f6e\u5faa\u73af\u6b21\u6570\uff0c\u5982\u679c\u5c0f\u4e8e 1\uff0c\u5219\u8bbe\u7f6e\u4e3a 1\u3002
    • \u65e0\u9650\u5faa\u73af\uff1a\u65e0\u56fa\u5b9a\u7ec8\u6b62\u6761\u4ef6\uff0c\u4efb\u52a1\u5c06\u6301\u7eed\u91cd\u590d\u6267\u884c\uff0c\u76f4\u81f3\u6ee1\u8db3\u505c\u6b62\u6761\u4ef6\u65f6\u7ec8\u6b62\uff0c\u9ed8\u8ba4\u6700\u5927\u5faa\u73af 1000 \u6b21\uff0c\u9002\u7528\u4e8e\u201c\u9700\u957f\u671f\u8fd0\u884c\uff0c\u5e76\u7b49\u5f85\u7279\u5b9a\u4e8b\u4ef6\u89e6\u53d1\u201d\u7684\u4f7f\u7528\u573a\u666f\u3002

    \u8f93\u51fa\u53c2\u6570\uff1a\u5728\u5faa\u73af\u4f53\u4e2d\u3010\u5faa\u73af\u5f00\u59cb\u3011\u8bbe\u7f6e\u7684\u5faa\u73af\u53d8\u91cf\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5faa\u73af\u8282\u70b9\u7684\u8f93\u51fa\u53c2\u6570\uff0c\u4f9b\u5404\u5de5\u4f5c\u6d41\u8282\u70b9\u8c03\u7528\u3002

    \u5faa\u73af\u4f53\uff1a\u5faa\u73af\u4f53\u753b\u5e03\u7528\u4e8e\u7f16\u6392\u5faa\u73af\u7684\u903b\u8f91\uff0c\u6bcf\u6b21\u5faa\u73af\u65f6\uff0c\u5de5\u4f5c\u6d41\u4f1a\u6267\u884c\u5faa\u73af\u4f53\u753b\u5e03\u4e2d\u7684\u5de5\u4f5c\u6d41\u3002

    \u5faa\u73af\u5f00\u59cb\uff1a\u4f5c\u4e3a\u5faa\u73af\u6267\u884c\u7684\u8d77\u70b9\uff0c\u5faa\u73af\u4f53\u4e2d\u6240\u6709\u540e\u7eed\u8282\u70b9\u5747\u4ece\u6b64\u8282\u70b9\u5f00\u59cb\u6d41\u8f6c\u3002

    \u8282\u70b9\u8bbe\u7f6e\uff1a

    • \u5faa\u73af\u53d8\u91cf\uff1a\u5faa\u73af\u4f53\u4e2d\u652f\u6301\u8bbe\u7f6e\u5faa\u73af\u53d8\u91cf\uff0c\u8be5\u53d8\u91cf\u53ef\u4f5c\u7528\u4e8e\u6bcf\u4e00\u6b21\u5faa\u73af\u3002\u5faa\u73af\u53d8\u91cf\u901a\u5e38\u4e0e\u53d8\u91cf\u8d4b\u503c\u642d\u914d\u4f7f\u7528\uff0c\u5728\u6bcf\u6b21\u5faa\u73af\u7ed3\u675f\u540e\u4e3a\u4e2d\u95f4\u53d8\u91cf\u8bbe\u7f6e\u4e00\u4e2a\u65b0\u7684\u503c\uff0c\u5e76\u5728\u4e0b\u6b21\u5faa\u73af\u4e2d\u4f7f\u7528\u65b0\u7684\u503c\u3002\u5faa\u73af\u53d8\u91cf\u53ef\u4ee5\u4f5c\u4e3a\u5faa\u73af\u8282\u70b9\u7684\u8f93\u51fa\u53c2\u6570\uff0c\u4f9b\u5faa\u73af\u4f53\u5916\u5de5\u4f5c\u6d41\u7684\u8282\u70b9\u8c03\u7528\u3002

    \u5faa\u73af\u53d8\u91cf\uff1a\u3010\u8282\u70b9\u8bbe\u7f6e\u3011\u4e2d\u6dfb\u52a0\u7684\u5faa\u73af\u53d8\u91cf\uff0c\u652f\u6301\u5728\u5faa\u73af\u4f53\u4e2d\u5f15\u7528\u3002

    \u8f93\u51fa\u53c2\u6570\uff1a

    • \u4e0b\u6807{index}\uff1a\u6570\u7ec4\u4e2d\u5143\u7d20\u7684\u4f4d\u7f6e\u3002\u7d22\u5f15\u4ece 0 \u5f00\u59cb\u8ba1\u6570\uff0c\u8868\u793a\u7b2c\u4e00\u6b21\u5faa\u73af\uff0c1 \u8868\u793a\u7b2c\u4e8c\u6b21\u5faa\u73af\uff0c2 \u8868\u793a\u7b2c\u4e09\u6b21\u5faa\u73af\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002\u6700\u540e\u4e00\u6b21\u5faa\u73af\u7684\u7d22\u5f15\u4e3a n-1\uff0c\u5176\u4e2d n \u4e3a\u5faa\u73af\u6b21\u6570\u3002
    • \u5faa\u73af\u5143\u7d20{item}\uff1a\u6570\u7ec4\u4e2d\u7684\u5355\u4e2a\u6570\u636e\u3002\u6570\u7ec4\u7531\u591a\u4e2a\u5143\u7d20\u7ec4\u6210\uff0c\u6bcf\u4e2a\u5143\u7d20\u53ef\u4ee5\u662f\u6570\u5b57\u3001\u5b57\u7b26\u3001\u5b57\u7b26\u4e32\u7b49\u6570\u636e\u7c7b\u578b\u3002

      \u4f8b\u5982\uff1a\u6570\u7ec4 array=[23,26,37,88,90]\uff0carray[0]\u7684 index \u662f 0\uff0citem \u4e3a 23\uff1b array[4]\u7684 index \u662f 4\uff0citem \u4e3a 90\u3002\n

    Continue\uff1a\u7528\u4e8e\u7ec8\u6b62\u5f53\u524d\u5faa\u73af\uff0c\u6267\u884c\u4e0b\u6b21\u5faa\u73af\u3002

    \u6dfb\u52a0\u6761\u4ef6\uff1a\u6dfb\u52a0\u7ec8\u6b62\u5f53\u524d\u5faa\u73af\u7684\u6761\u4ef6\uff0c\u5f53\u6ee1\u8db3\u6761\u4ef6\u65f6\uff0c\u7ec8\u6b62\u5f53\u524d\u5faa\u73af\uff0c\u6267\u884c\u4e0b\u6b21\u7684\u5faa\u73af\u3002

    Break\uff1a\u7ec8\u6b62\u5f53\u524d\u5faa\u73af\uff0c\u8df3\u51fa\u5faa\u73af\u4f53.

    \u6dfb\u52a0\u6761\u4ef6\uff1a\u6dfb\u52a0\u7ec8\u6b62\u5f53\u524d\u5faa\u73af\u7684\u6761\u4ef6\uff0c\u5f53\u6ee1\u8db3\u6761\u4ef6\u65f6\uff0c\u7ec8\u6b62\u5f53\u524d\u5faa\u73af\uff0c\u8df3\u51fa\u5faa\u73af\u4f53\uff0c\u7ee7\u7eed\u5de5\u4f5c\u6d41\u3002

    \u6ce8\u610f\uff1a

    • \u5faa\u73af\u4f53\u5185\u4e0d\u652f\u6301\u6dfb\u52a0\u5faa\u73af\u8282\u70b9\uff0c\u907f\u514d\u9020\u6210\u6b7b\u5faa\u73af\uff1b
    • \u5faa\u73af\u7c7b\u578b\u4e3a\u65e0\u9650\u5faa\u73af\u65f6\uff0c\u9ed8\u8ba4\u6700\u5927\u5faa\u73af 1000 \u6b21\uff0c\u5982\u9700\u4fee\u6539\u914d\u7f6e\u53c2\u6570\uff0c\u5219\u9700\u8981\u5728 ${MAXKB_BASE}/maxkb/.env\uff08\u9ed8\u8ba4\u662f /opt/maxkb/.env\uff09\u6587\u4ef6\u4e2d\u8fdb\u884c\u4fee\u6539\uff0c\u5e76\u4e14\u5728\u4fee\u6539\u5b8c\u540e\u9700\u6267\u884c mkctl reload \u547d\u4ee4\u91cd\u65b0\u52a0\u8f7d\u914d\u7f6e\u6587\u4ef6\u3002
    "},{"location":"user_manual/app/workflow_app/#24","title":"2.4 \u5176\u4ed6","text":""},{"location":"user_manual/app/workflow_app/#241-mcp","title":"2.4.1 MCP \u8c03\u7528","text":"

    \u8282\u70b9\u8bf4\u660e\uff1a\u901a\u8fc7 SSE/Streamable_HTTP \u534f\u8bae\u8c03\u7528 MCP \u670d\u52a1\u4e2d\u7684\u5de5\u5177\u3002

    \u8282\u70b9\u8bbe\u7f6e\uff1a

    • MCP Server Config\uff1a\u652f\u6301\u5f15\u7528 MCP\uff0c\u4e5f\u652f\u6301\u81ea\u5b9a\u4e49 MCP \u670d\u52a1\uff08\u4f7f\u7528 JSON \u683c\u5f0f\u586b\u5199 MCP Server \u914d\u7f6e\u53c2\u6570\uff09\u3002
    • \u5de5\u5177\uff1a\u5bf9\u5e94 MCP Server\u4e0b\u7684\u5de5\u5177\u5217\u8868\u3002

    \u5de5\u5177\u53c2\u6570\uff1aMCP \u5de5\u5177\u5bf9\u5e94\u7684\u8bf7\u6c42\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\uff0c\u4e5f\u53ef\u5f15\u7528\u53d8\u91cf\u3002

    \u53c2\u6570\u8f93\u51fa\uff1a

    • \u7ed3\u679c {result}\uff1aMCP \u5de5\u5177\u6267\u884c\u8fd4\u56de\u7ed3\u679c\u3002

    MCP Server Config \u683c\u5f0f\u53c2\u8003\u5982\u4e0b\n{\n    \"amap-maps\": {\n      \"url\": \"http://ip/u7aef/u53e3/MCPserver/u540d/u79f0/",\n      \"transport\":\"sse\"               # \u5982\u679c\u4f7f\u7528 Streamable_HTTP \u534f\u8bae\uff0c\u9700\u5c06\"sse\"\u66ff\u6362\u6210\"streamable_http\"\n    }\n}\n
    "},{"location":"user_manual/app/workflow_app/#242","title":"2.4.2 \u6587\u6863\u5185\u5bb9\u63d0\u53d6","text":"

    \u8282\u70b9\u8bf4\u660e\uff1a\u5bf9\u7528\u6237\u4e0a\u4f20\u7684\u6587\u6863\u8fdb\u884c\u5185\u5bb9\u603b\u7ed3\u3002

    \u8282\u70b9\u8bbe\u7f6e\uff1a

    • \u9009\u62e9\u6587\u6863\uff1a\u5373\u7528\u6237\u4e0a\u4f20\u7684\u6587\u6863\uff0c\u9700\u8981\u5728\u57fa\u672c\u4fe1\u606f\u8282\u70b9\u5f00\u542f\u5bf9\u6587\u4ef6\u4e0a\u4f20\u7684\u652f\u6301\u3002

    \u53c2\u6570\u8f93\u51fa\uff1a

    • \u6587\u6863\u8f93\u51fa {content}\uff1a\u5bf9\u7528\u6237\u4e0a\u4f20\u6587\u4ef6\u8fdb\u884c\u7684\u603b\u7ed3\u8f93\u51fa\u3002

    "},{"location":"user_manual/app/workflow_app/#243","title":"2.4.3 \u81ea\u5b9a\u4e49\u5de5\u5177","text":"

    \u5728\u9ad8\u7ea7\u7f16\u6392\u6d41\u7a0b\u4e2d\uff0c\u7f16\u5199 Python \u4ee3\u7801\u548c\u6dfb\u52a0\u53c2\u6570\u521b\u5efa\u5de5\u5177\u6570\u4f5c\u4e3a\u6d41\u7a0b\u4e2d\u7684\u4e00\u4e2a\u5904\u7406\u8282\u70b9\uff0c\u4ee5\u7075\u6d3b\u5904\u7406\u590d\u6742\u9700\u6c42\uff0c\u51fd\u6570\u8be6\u7ec6\u8bf4\u660e\u89c1\uff1a\u5de5\u5177\u3002

    "},{"location":"user_manual/app/workflow_app/#25","title":"2.5 \u5de5\u5177","text":"

    \u5728\u9ad8\u7ea7\u7f16\u6392\u6d41\u7a0b\u4e2d\uff0c\u53ef\u4ee5\u6dfb\u52a0\u5de5\u5177\u4e2d\u7684\u4e00\u4e2a\u5904\u7406\u8282\u70b9\uff0c\u4ee5\u7075\u6d3b\u5904\u7406\u590d\u6742\u9700\u6c42\uff0c\u51fd\u6570\u8be6\u7ec6\u8bf4\u660e\u89c1\uff1a\u5de5\u5177\u3002

    \u8282\u70b9\u8bbe\u7f6e\uff1a\u5373\u5de5\u5177\u7684\u8f93\u5165\u53c2\u6570\u3002

    \u53c2\u6570\u8f93\u51fa\uff1a\u5373\u5de5\u5177\u7684\u8fd4\u56de\u7ed3\u679c\u3002

    "},{"location":"user_manual/app/workflow_app/#26","title":"2.6 \u5e94\u7528","text":"

    \u5728\u9ad8\u7ea7\u7f16\u6392\u6d41\u7a0b\u4e2d\uff0c\u53ef\u4ee5\u6dfb\u52a0\u5176\u5b83\u5e94\u7528\uff08\u7b80\u5355\u914d\u7f6e\u5e94\u7528\u548c\u6d41\u7a0b\u7f16\u6392\u5e94\u7528\uff09\u4f5c\u4e3a\u6d41\u7a0b\u4e2d\u7684\u4e00\u4e2a\u5904\u7406\u8282\u70b9\uff0c\u76f4\u63a5\u5feb\u901f\u5229\u7528\u5b50\u5e94\u7528\u7684\u95ee\u7b54\u7ed3\u679c\u3002

    \u8282\u70b9\u8bbe\u7f6e\uff1a

    • \u7528\u6237\u95ee\u9898\uff1a\u5bf9\u5b50\u5e94\u7528\u7684\u63d0\u95ee\u4fe1\u606f\u3002
    • \u8fd4\u56de\u5185\u5bb9\uff1a\u5f00\u542f\u540e\u5728\u5bf9\u8bdd\u8fc7\u7a0b\u4e2d\u5c06\u5b50\u5e94\u7528\u7684\u8fd4\u56de\u7ed3\u679c\u3002

    \u53c2\u6570\u8f93\u51fa\uff1a

    • \u7ed3\u679c\uff1a\u5373\u5b50\u5e94\u7528\u7684\u8fd4\u56de\u7ed3\u679c\u3002

    "},{"location":"user_manual/app/workflow_app/#3","title":"3 \u5176\u5b83\u8bf4\u660e","text":""},{"location":"user_manual/app/workflow_app/#31","title":"3.1 \u6267\u884c\u6761\u4ef6","text":"

    MaxKB \u5de5\u4f5c\u6d41\u4e2d\u652f\u6301\u591a\u51fa\u591a\u8fdb\uff0c\u5728\u8fd9\u4e2a\u60c5\u51b5\u4e0b\uff0c\u6c47\u96c6\u8282\u70b9\u53ef\u4ee5\u6839\u636e\u4e0e\u524d\u7f6e\u8282\u70b9\u7684\u903b\u8f91\u5173\u7cfb\uff0c\u9009\u62e9\u6267\u884c\u6761\u4ef6\u3002

    • \u6240\u6709\uff1a\u9700\u8981\u7b49\u6240\u6709\u524d\u7f6e\u8fde\u7ebf\u8282\u70b9\u5168\u90e8\u6267\u884c\u5b8c\u6210\u540e\uff0c\u624d\u53ef\u6267\u884c\u5f53\u524d\u8282\u70b9\u3002
    • \u4efb\u4e00\uff1a\u4efb\u4e00\u524d\u7f6e\u8fde\u7ebf\u8282\u70b9\u6267\u884c\u5b8c\u6210\u540e\uff0c\u5373\u53ef\u6267\u884c\u5f53\u524d\u8282\u70b9\u3002

    "},{"location":"user_manual/app/workflow_app/#32","title":"3.2 \u8c03\u8bd5","text":"

    \u5b8c\u6210\u6240\u6709\u7684\u7f16\u6392\u8bbe\u8ba1\u540e\uff0c\u53ef\u70b9\u51fb\u3010\u8c03\u8bd5\u3011\u540e\uff0c\u5148\u6821\u9a8c\u6d41\u7a0b\u662f\u5426\u5408\u89c4\uff0c\u6821\u9a8c\u901a\u8fc7\u540e\u53ef\u5728\u5f53\u524d\u9875\u9762\u8fdb\u884c\u5bf9\u8bdd\u6d4b\u8bd5\u3002

    \u5728\u8c03\u8bd5\u5bf9\u8bdd\u6846\u4e2d\u8fdb\u884c\u63d0\u95ee\uff0cAI \u56de\u7b54\u5b8c\u6210\u540e\uff0c\u4f1a\u663e\u793a\u3010\u6267\u884c\u8be6\u60c5\u3011\uff0c\u70b9\u51fb\u3010\u6267\u884c\u8be6\u60c5\u3011\u540e\uff0c\u5728\u5f39\u51fa\u6267\u884c\u8be6\u60c5\u5bf9\u8bdd\u6846\u4e2d\u53ef\u4ee5\u67e5\u770b\u6bcf\u4e2a\u6d41\u7a0b\u8282\u70b9\u7684\u6267\u884c\u72b6\u6001\u3001\u8017\u65f6\u4ee5\u53ca\u5176\u5b83\u6267\u884c\u4fe1\u606f\u3002

    "},{"location":"user_manual/app/workflow_app/#33","title":"3.3 \u53d1\u5e03\u5386\u53f2","text":"

    \u5e94\u7528\u9ad8\u7ea7\u7f16\u6392\u4e2d\uff0c\u652f\u6301\u67e5\u770b\u53d1\u5e03\u5386\u53f2\u7248\u672c\u7684\u5de5\u4f5c\u6d41\u3001\u65f6\u95f4\u548c\u7528\u6237\u3002

    \u53ef\u5bf9\u5386\u53f2\u53d1\u5e03\u7684\u7248\u672c\u65f6\u95f4\u8fdb\u884c\u7f16\u8f91\u3002

    \u53ef\u6062\u590d\u5386\u53f2\u7248\u672c\u7684\u5de5\u4f5c\u6d41\u3002

    "},{"location":"user_manual/app/workflow_app/#34","title":"3.4 \u81ea\u52a8\u4fdd\u5b58","text":"

    \u9ad8\u7ea7\u7f16\u6392\u6d41\u7a0b\u9ed8\u8ba4\u624b\u52a8\u4fdd\u5b58\uff0c\u4e5f\u53ef\u8bbe\u7f6e\u81ea\u52a8\u4fdd\u5b58\uff0c\u5f00\u542f\u81ea\u52a8\u4fdd\u5b58\u540e\u5c06\u6bcf\u9694 1 \u5206\u949f\u4fdd\u5b58\u5230\u672c\u5730\uff0c\u5e76\u5728\u53d1\u5e03\u6210\u529f\u540e\u5c06\u914d\u7f6e\u540c\u6b65\u5230\u540e\u53f0\u6570\u636e\u5e93\u3002

    "},{"location":"user_manual/app/workflow_app/#35","title":"3.5 \u53d1\u5e03","text":"

    \u70b9\u51fb\u3010\u53d1\u5e03\u3011\u540e\u4f1a\u5148\u6821\u9a8c\u5f53\u524d\u5de5\u4f5c\u6d41\u662f\u5426\u7b26\u5408\u89c4\u5219\uff0c\u5982\u679c\u5408\u89c4\u5c06\u6210\u529f\u53d1\u5e03\uff0c\u5426\u5219\u53d1\u5e03\u5931\u8d25\u3002\u53d1\u5e03\u6210\u529f\u540e\uff0c\u6240\u6709\u8282\u70b9\u914d\u7f6e\u4fee\u6539\u624d\u5728\u95ee\u7b54\u9875\u9762\u4e2d\u751f\u6548\u3002

    \u53ef\u4ee5\u70b9\u51fb\u3010\u53bb\u5bf9\u8bdd\u3011\u8fdb\u884c AI \u95ee\u7b54\uff0c\u4e5f\u53ef\u4ee5\u67e5\u770b\u53d1\u5e03\u5386\u53f2\u5e76\u8fdb\u884c\u7248\u672c\u6062\u590d\u3002

    "},{"location":"user_manual/dataset/dataset/","title":"\u77e5\u8bc6\u5e93","text":"

    \u4f01\u4e1a\u79c1\u6709\u7684\u4e13\u4e1a\u77e5\u8bc6\u5e93\uff0c\u5305\u542b\u5404\u79cd\u7c7b\u578b\u7684\u6570\u636e\u3002\u652f\u6301\u521b\u5efa\u548c\u7ba1\u7406\u77e5\u8bc6\u5e93\uff0c\u4e3a\u95ee\u7b54\u5bf9\u8bdd\u63d0\u4f9b\u77e5\u8bc6\u6765\u6e90\uff0c\u52a9\u529b\u667a\u80fd\u95ee\u7b54\u3002

    • \u5171\u4eab\u77e5\u8bc6\u5e93\uff1a\u7cfb\u7edf\u7ba1\u7406\u5458\u5728\u3010\u5171\u4eab\u8d44\u6e90\u3011\u4e2d\u521b\u5efa\u5171\u4eab\u540e\uff0c\u53ef\u4ee5\u6388\u6743\u7ed9\u6307\u5b9a\u5de5\u4f5c\u7a7a\u95f4\u3002
    • \u5168\u90e8\u77e5\u8bc6\u5e93\uff1a\u7528\u6237\u53ef\u4ee5\u521b\u5efa\u77e5\u8bc6\u5e93\uff0c\u5176\u4ed6\u7528\u6237\u8d44\u6e90\u6388\u6743\u540e\u53ef\u4ee5\u67e5\u770b\u3001\u4f7f\u7528\u548c\u7ef4\u62a4\u3002

    \u77e5\u8bc6\u5e93\u901a\u8fc7\u6587\u4ef6\u5939\u8fdb\u884c\u7ba1\u7406\uff0c\u6839\u76ee\u5f55\u4e0b\u53ef\u5efa\u7acb\u6700\u591a\u4e09\u7ea7\u7684\u5b50\u6587\u4ef6\u5939\u3002\u6bcf\u4e00\u7ea7\u6587\u4ef6\u5939\u5185\u5747\u53ef\u521b\u5efa\u76f8\u5e94\u7684\u77e5\u8bc6\u5e93\u3002\u7528\u6237\u53ef\u4ee5\u521b\u5efa\u77e5\u8bc6\u5e93\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u8d44\u6e90\u6388\u6743\u540e\u7684\u77e5\u8bc6\u5e93\u3002

    \u6ce8\u610f\uff1a\u5171\u4eab\u8d44\u6e90\u4e3a\u4f01\u4e1a\u7248 X-Pack \u529f\u80fd\u3002

    "},{"location":"user_manual/dataset/dataset/#1","title":"1 \u521b\u5efa\u77e5\u8bc6\u5e93","text":"

    \u6253\u5f00\u3010\u77e5\u8bc6\u5e93\u3011\u9875\u9762\uff0c\u70b9\u51fb\u3010\u521b\u5efa\u77e5\u8bc6\u5e93\u3011\uff0c\u8fdb\u5165\u521b\u5efa\u77e5\u8bc6\u5e93\u9875\u9762\u3002 \u77e5\u8bc6\u5e93\u7c7b\u578b\uff1a

    • \u901a\u7528\u578b\u77e5\u8bc6\u5e93\uff1a\u5bf9\u79bb\u7ebf\u6587\u6863\u4e0a\u4f20\u7ba1\u7406\uff0c\u652f\u6301\u7684\u6587\u672c\u6587\u6863\u683c\u5f0f\u5305\u62ec Markdown\u3001TXT\u3001PDF\u3001DOCX\u3001HTML\uff0c\u4ee5\u53ca Excel\u3001CSV \u683c\u5f0f\u7684 QA \u95ee\u7b54\u5bf9\u3002
    • Web \u7ad9\u70b9\u77e5\u8bc6\u5e93\uff1a\u7528\u4e8e\u83b7\u53d6\u5728\u7ebf\u9759\u6001\u6587\u672c\u6570\u636e\u7ba1\u7406\uff0c\u8f93\u5165 Web \u6839\u5730\u5740\u540e\u81ea\u52a8\u540c\u6b65\u6839\u5730\u5740\u53ca\u5b50\u7ea7\u5730\u5740\u7684\u6587\u672c\u6570\u636e\u3002
    • \u98de\u4e66\u77e5\u8bc6\u5e93\uff1a\u652f\u6301\u5bf9\u63a5\u98de\u4e66\u7684\u4e91\u6587\u6863\u548c\u8868\u683c\u6587\u6863\uff0c\u5c06\u98de\u4e66\u6587\u6863\u5185\u5bb9\u5bfc\u5165\u5230 MaxKB \u4e2d\u8fdb\u884c\u7ba1\u7406\u3002

    \u6ce8\u610f\uff1a\u98de\u4e66\u77e5\u8bc6\u5e93 X-Pack \u529f\u80fd\uff0c\u5177\u4f53\u4f7f\u7528\u53ef\u53c2\u8003\u98de\u4e66\u6587\u6863\u3002

    "},{"location":"user_manual/dataset/dataset/#11","title":"1.1 \u901a\u7528\u578b\u77e5\u8bc6\u5e93","text":"

    \u9009\u62e9\u77e5\u8bc6\u5e93\u7c7b\u578b\u4e3a\u901a\u7528\u578b\uff0c\u8f93\u5165\u77e5\u8bc6\u5e93\u540d\u79f0\u3001\u77e5\u8bc6\u5e93\u63cf\u8ff0\uff0c\u9009\u62e9\u5411\u91cf\u6a21\u578b\u3002

    \u521b\u5efa\u77e5\u8bc6\u5e93\u540e\uff0c\u652f\u6301\u65b0\u5efa\u6587\u6863\u548c\u4e0a\u4f20\u79bb\u7ebf\u6587\u6863\u3002

    \u53ef\u79bb\u7ebf\u6587\u6863\u901a\u8fc7\u62d6\u62fd\u6216\u9009\u62e9\u6587\u4ef6\u65b9\u5f0f\u8fdb\u884c\u4e0a\u4f20\u3002 \u4e0a\u4f20\u6587\u6863\u8981\u6c42\uff1a

    • \u6587\u672c\u6587\u4ef6\uff1aMarkdown\u3001TXT\u3001PDF\u3001DOCX\u3001HTML\u3001XLS\u3001XLSX\u3001CSV\u3001ZIP\uff1b
    • \u8868\u683c\uff1aXLS\u3001XLSX\u3001CSV\u3001ZIP\uff1b
    • QA \u95ee\u7b54\u5bf9\uff1aXLS\u3001XLSX\u3001CSV\u3001ZIP\uff1b
    • \u9ed8\u8ba4\u6bcf\u6b21\u6700\u591a\u4e0a\u4f20 50 \u4e2a\u6587\u4ef6\uff0c\u6bcf\u4e2a\u6587\u4ef6\u4e0d\u8d85\u8fc7 100 MB\uff0c\u53ef\u914d\u7f6e\uff0c\u4e0a\u4f20\u6587\u4ef6\u6570\u91cf\u6700\u591a\u4e3a 1000\uff0c\u5355\u4e2a\u6587\u6863\u6700\u5927 1000 MB\uff1b
    • \u652f\u6301\u9009\u62e9\u6587\u4ef6\u5939\uff0c\u4e0a\u4f20\u6587\u4ef6\u5939\u4e0b\u7b26\u5408\u8981\u6c42\u7684\u6587\u4ef6\u3002
    • ZIP \u6587\u4ef6\u5305\u62ec\u4e24\u79cd\u5f62\u5f0f\uff1a

      • Markdown \u6587\u6863 + \u56fe\u7247\u6587\u4ef6\uff0cMarkDown \u6587\u6863\u4e2d\u5f15\u5165\u5bf9\u5e94\u7684\u56fe\u7247\uff0c\u5e76\u5c06\u4e24\u8005\u6253\u5305\u5728 ZIP \u4e2d\u3002
      • XLS/XLSX \u6587\u4ef6 + \u56fe\u7247\u6587\u4ef6\uff0cXLS/XLSX \u6587\u4ef6\u4e2d\u5f15\u5165\u5bf9\u5e94\u7684\u56fe\u7247\uff0c\u5e76\u5c06\u4e24\u8005\u6253\u5305\u5728 ZIP \u4e2d\u3002

    \u6587\u6863\u5206\u6bb5\uff1a

    • \u9009\u62e9\u5206\u6bb5\u89c4\u5219\uff0c\u652f\u6301\u667a\u80fd\u5206\u6bb5\u4ee5\u53ca\u9ad8\u7ea7\u5206\u6bb5\u4e24\u79cd\u65b9\u5f0f\uff1a

      • \u667a\u80fd\u5206\u6bb5\uff1a\u6309\u7167 Markdown \u683c\u5f0f\u8fdb\u884c\u9010\u7ea7\u4e0b\u94bb\u5f0f\u5206\u6bb5\uff08\u6700\u591a\u652f\u6301 6 \u7ea7\u6807\u9898\uff09\uff0c\u6bcf\u6bb5\u6700\u5927\u5b57\u7b26\u6570\u4e3a 4096 \u4e2a\uff1b
      • \u9ad8\u7ea7\u5206\u6bb5\uff1a\u652f\u6301\u81ea\u5b9a\u4e49\u8bbe\u7f6e\u5206\u6bb5\u6807\u8bc6\u7b26\u3001\u5206\u6bb5\u957f\u5ea6\u53ca\u81ea\u52a8\u6e05\u6d17\u3002\u5206\u6bb5\u6807\u8bc6\u8fd8\u652f\u6301\u4f7f\u7528\u6b63\u5219\u8868\u8fbe\u5f0f\u5904\u7406\u590d\u6742\u7ed3\u6784\u6587\u6863\u3002
    • \u5bfc\u5165\u65f6\u6dfb\u52a0\u5206\u6bb5\u6807\u9898\u4e3a\u5173\u8054\u95ee\u9898\uff1a\u52fe\u9009\u540e\u4f1a\u628a\u6240\u6709\u5206\u6bb5\u7684\u6807\u9898\u8bbe\u7f6e\u4e3a\u5206\u6bb5\u7684\u5173\u8054\u95ee\u9898\u3002

    • \u5206\u6bb5\u9884\u89c8\uff1a\u6839\u636e\u5206\u6bb5\u89c4\u5219\u548c\u8bbe\u7f6e\uff0c\u67e5\u770b\u5206\u6bb5\u6548\u679c\u3002

    • \u5206\u6bb5\u64cd\u4f5c\uff1a\u5728\u5206\u6bb5\u9884\u89c8\u4e2d\u5bf9\u4e0d\u5408\u7406\u7684\u5206\u6bb5\u8fdb\u884c\u518d\u6b21\u7f16\u8f91\u4ee5\u53ca\u5220\u9664\u65e0\u610f\u4e49\u5206\u6bb5\u3002
    • \u6b65\u9aa4\u64cd\u4f5c\uff1a\u53ef\u8fd4\u56de\u4e0a\u4e00\u6b65\u91cd\u65b0\u4e0a\u4f20\u6587\u6863\uff0c\u6216\u8005\u786e\u8ba4\u4e0a\u4f20\u5f00\u59cb\u5411\u91cf\u5316\u3002

    \u667a\u80fd\u5206\u6bb5\u4e0e\u9ad8\u7ea7\u5206\u6bb5\uff1a

    \u667a\u80fd\u5206\u6bb5\uff1a

    • MarkDown \u7c7b\u578b\u6587\u4ef6\u667a\u80fd\u5206\u6bb5\u89c4\u5219

      • \u6839\u636e\u6807\u9898\u9010\u7ea7\u4e0b\u94bb\u5f0f\u5206\u6bb5\uff08\u6700\u591a\u652f\u6301 6 \u7ea7\u6807\u9898\uff09\uff0c\u6bcf\u4e2a\u6bb5\u843d\u6700\u591a 4096 \u4e2a\u5b57\u7b26\uff1b
      • \u5f53\u6700\u540e\u4e00\u7ea7\u7684\u6587\u672c\u6bb5\u843d\u5b57\u7b26\u6570\u8d85\u8fc7\u8bbe\u7f6e\u7684\u5206\u6bb5\u957f\u5ea6\u65f6\uff0c\u4f1a\u67e5\u627e\u5206\u6bb5\u957f\u5ea6\u4ee5\u5185\u7684\u56de\u8f66\u8fdb\u884c\u622a\u53d6\u3002
    • HTML\u3001DOCX \u7c7b\u578b\u667a\u80fd\u5206\u6bb5\u89c4\u5219

      • \u8bc6\u522b\u6807\u9898\u683c\u5f0f\u8f6c\u6362\u6210 markdown \u7684\u6807\u9898\u6837\u5f0f\uff1b
      • \u9010\u7ea7\u4e0b\u94bb\u8fdb\u884c\u5206\u6bb5\uff08\u6700\u591a\u652f\u6301 6 \u7ea7\u6807\u9898\uff09\uff0c\u6bcf\u4e2a\u6bb5\u843d\u6700\u591a 4096 \u4e2a\u5b57\u7b26\u3002
    • TXT\u548c PDF \u7c7b\u578b\u6587\u4ef6\u667a\u80fd\u5206\u6bb5\u89c4\u5219

      • \u6309\u7167\u6807\u9898# \u8fdb\u884c\u5206\u6bb5\uff0c\u82e5\u6ca1\u6709#\u6807\u9898\u7684\u5219\u6309\u7167\u5b57\u7b26\u6570 4096 \u4e2a\u5b57\u7b26\u8fdb\u884c\u5206\u6bb5\uff1b
      • \u67e5\u627e\u5206\u6bb5\u957f\u5ea6\u4ee5\u5185\u7684\u56de\u8f66\u8fdb\u884c\u622a\u53d6\u3002

    \u9ad8\u7ea7\u5206\u6bb5\uff1a

    • \u5206\u6bb5\u6807\u8bc6\u652f\u6301\uff1a#\u3001##\u3001###\u3001####\u3001#####\u3001######\u3001-\u3001\u7a7a\u884c\u3001\u56de\u8f66\u3001\u7a7a\u683c\u3001\u5206\u53f7\u3001\u9017\u53f7\u3001\u53e5\u53f7\uff0c\u5e76\u652f\u6301\u624b\u52a8\u8f93\u5165\u5176\u5b83\u5206\u6bb5\u6807\u8bc6\u7b26\u6216\u6b63\u5219\u8868\u8fbe\u5f0f\u3002
    • \u5206\u6bb5\u957f\u5ea6\uff1a\u5355\u4e2a\u5206\u6bb5\u7684\u957f\u5ea6\uff0c\u8303\u56f4 50 \u81f3 4096 \u4e2a\u5b57\u7b26\u3002
    • \u81ea\u52a8\u6e05\u6d17\uff1a\u5f00\u542f\u540e\u7cfb\u7edf\u4f1a\u81ea\u52a8\u53bb\u6389\u91cd\u590d\u591a\u4f59\u7684\u7b26\u53f7\u5982\u7a7a\u683c\u3001\u7a7a\u884c\u3001\u5236\u8868\u7b26\u7b49\u3002
    • \u6587\u6863\u89c4\u8303\u5efa\u8bae\uff1a
      • \u6807\u8bc6\u89c4\u8303\uff1a\u79bb\u7ebf\u6587\u6863\u7684\u5206\u6bb5\u6807\u8bc6\u8981\u6709\u4e00\u5b9a\u89c4\u8303\uff0c\u5426\u5219\u62c6\u5206\u51fa\u6765\u7684\u6bb5\u843d\u4e0d\u89c4\u6574\u3002
      • \u6bb5\u843d\u5b8c\u6574\uff1a\u5728\u4e00\u4e2a\u5206\u6bb5\u4e2d\u96c6\u4e2d\u63cf\u8ff0\u4e00\u4e2a\u5b8c\u6574\u7684\u5185\u5bb9\u3002

    \u5bfc\u5165\u65f6\u6dfb\u52a0\u5206\u6bb5\u6807\u9898\u4e3a\u5173\u8054\u95ee\u9898: \u52fe\u9009\u540e\u4f1a\u628a\u6240\u6709\u5206\u6bb5\u7684\u6807\u9898\u8bbe\u7f6e\u4e3a\u5206\u6bb5\u7684\u5173\u8054\u95ee\u9898\u3002

    \u70b9\u51fb\u3010\u5f00\u59cb\u5bfc\u5165\u3011\u540e\uff0c\u7cfb\u7edf\u540e\u53f0\u4f1a\u5bf9\u6587\u6863\u8fdb\u884c\u81ea\u52a8\u5206\u6bb5 -> \u5b58\u50a8 -> \u5411\u91cf\u5316\u64cd\u4f5c\uff0c\u5904\u7406\u7ed3\u675f\u540e\uff0c\u6587\u4ef6\u72b6\u6001\u5c06\u663e\u793a\u4e3a\u5b8c\u6210\u3002

    "},{"location":"user_manual/dataset/dataset/#12-web","title":"1.2 Web \u7ad9\u70b9\u77e5\u8bc6\u5e93","text":"

    \u8f93\u5165\u77e5\u8bc6\u5e93\u540d\u79f0\u3001\u77e5\u8bc6\u5e93\u63cf\u8ff0\uff0c\u9009\u62e9\u5411\u91cf\u6a21\u578b\u5e76\u8bbe\u7f6e\u77e5\u8bc6\u5e93\u7c7b\u578b\u4e3a Web \u7ad9\u70b9\u3002

    • Web \u6839\u5730\u5740\uff1a\u4e3a\u5728\u7ebf\u9759\u6001\u7f51\u9875\u7ad9\u70b9\u7684\u6839\u8282\u70b9\u5730\u5740\uff0c\u7cfb\u7edf\u4f1a\u81ea\u52a8\u83b7\u53d6 Web \u6839\u5730\u5740\u53ca\u5b50\u7ea7\u5730\u5740\u7684\u6570\u636e\u8d44\u6599\u3002\u4ee5 DataEase V2 \u5728\u7ebf\u6587\u6863\u4e3a\u4f8b\uff0c\u53ef\u5728 Web \u6839\u5730\u5740\u4e3a\uff1ahttps://dataease.io/docs/v2/ \u3002
    • \u9009\u62e9\u5668\uff1a\u9488\u5bf9 Web \u9875\u9762\u7684\u6570\u636e\u53ef\u4ee5\u8bbe\u7f6e\u5b9a\u83b7\u53d6\u67d0\u4e2adiv\u5185\u7684\u6570\u636e\uff0c\u9ed8\u8ba4\u83b7\u53d6 body \u6570\u636e\u3002\u5982 DataEase \u5728\u7ebf\u6587\u6863\u4ec5\u83b7\u53d6\u4e2d\u95f4\u5185\u5bb9\u90e8\u5206\uff0c\u53ef\u4ee5\u53f3\u952e\u68c0\u67e5\u7f51\u9875\uff0c\u5b9a\u4f4d\u5230\u4e2d\u95f4\u5185\u90e8\u533a\u57df\u627e\u5230 div \u4e3a md-content\uff0c\u5219\u9009\u62e9\u5668\u8f93\u5165\u4e3a\uff1a.md-content \u3002

    \u70b9\u51fb\u3010\u521b\u5efa\u3011\u540e\uff0c\u8df3\u8f6c\u5230\u6587\u6863\u5217\u8868\u9875\u9762\u67e5\u770b\u5f53\u524d Web \u7ad9\u70b9\u4e0b\u6587\u6863\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u5904\u7406\u7ed3\u675f\u540e\uff0c\u6587\u4ef6\u72b6\u6001\u5c06\u663e\u793a\u4e3a\u5b8c\u6210\u3002

    "},{"location":"user_manual/dataset/dataset/#2","title":"2 \u77e5\u8bc6\u5e93\u64cd\u4f5c","text":"

    MaxKB \u77e5\u8bc6\u5e93\u652f\u6301\u540c\u6b65\u3001\u91cd\u65b0\u5411\u91cf\u5316\u3001\u751f\u6210\u95ee\u9898\u3001\u8f6c\u79fb\u3001\u8bbe\u7f6e\u3001\u5bfc\u51fa\u4ee5\u53ca\u5220\u9664\u64cd\u4f5c\u3002

    "},{"location":"user_manual/dataset/dataset/#21-web","title":"2.1 \u540c\u6b65 Web \u77e5\u8bc6\u5e93","text":"

    \u5bf9\u4e8e Web \u7ad9\u70b9\u7c7b\u578b\u77e5\u8bc6\u5e93\uff0c\u70b9\u51fb\u77e5\u8bc6\u5e93\u9762\u677f\u7684\u3010\u540c\u6b65\u3011\uff0c\u652f\u6301\u5bf9 Web \u77e5\u8bc6\u5e93\u7684\u5185\u5bb9\u8fdb\u884c\u540c\u6b65\u66f4\u65b0\u3002

    • \u540c\u6b65\u66ff\u6362\uff1a\u91cd\u65b0\u83b7\u53d6 Web \u7ad9\u70b9\u6587\u6863\uff0c\u8986\u76d6\u66ff\u6362\u672c\u5730\u77e5\u8bc6\u5e93\u4e2d\u7684\u6587\u6863\u3002
    • \u6574\u4f53\u540c\u6b65\uff1a\u5148\u5220\u9664\u672c\u5730\u77e5\u8bc6\u5e93\u7684\u6240\u6709\u6587\u6863\uff0c\u91cd\u65b0\u83b7\u53d6 Web \u7ad9\u70b9\u6587\u6863\u3002

    "},{"location":"user_manual/dataset/dataset/#22","title":"2.2 \u91cd\u65b0\u5411\u91cf\u5316","text":"

    \u5982\u679c\u5728\u77e5\u8bc6\u5e93\u8bbe\u7f6e\u4e2d\u9009\u62e9\u4e86\u4e0d\u540c\u7684\u5411\u91cf\u6a21\u578b\uff0c\u5bf9\u4e8e\u65b0\u589e\u7684\u6587\u6863\u5c06\u4f7f\u7528\u65b0\u8bbe\u7f6e\u7684\u5411\u91cf\u6a21\u578b\u8fdb\u884c\u5411\u91cf\u5316\uff0c\u5982\u679c\u8981\u5bf9\u5df2\u6709\u7684\u77e5\u8bc6\u5e93\u8fdb\u884c\u91cd\u65b0\u5411\u91cf\u5316\uff0c\u53ef\u5728\u77e5\u8bc6\u5e93\u5361\u7247\u7f51\u683c\u4e2d\uff0c\u70b9\u51fb\u77e5\u8bc6\u5e93\u9762\u677f\u7684\u3010\u91cd\u65b0\u5411\u91cf\u5316\u3011\uff0c\u5bf9\u77e5\u8bc6\u5e93\u4e2d\u5df2\u6709\u7684\u5206\u6bb5\u8fdb\u884c\u91cd\u65b0\u5411\u91cf\u5316\u3002

    "},{"location":"user_manual/dataset/dataset/#23","title":"2.3 \u8bbe\u7f6e\u77e5\u8bc6\u5e93","text":"

    \u5728\u77e5\u8bc6\u5e93\u5217\u8868\uff0c\u70b9\u51fb\u77e5\u8bc6\u5e93\u9762\u677f\u7684\u3010\u8bbe\u7f6e\u3011\u8fdb\u5165\u77e5\u8bc6\u5e93\u8bbe\u7f6e\u9875\u9762\uff0c\u53ef\u4ee5\u5bf9\u5f53\u524d\u77e5\u8bc6\u5e93\u540d\u79f0\u3001\u63cf\u8ff0\u3001\u5411\u91cf\u6a21\u578b\u7b49\u5c5e\u6027\u8fdb\u884c\u4fee\u6539\uff0c\u6240\u6709\u8bbe\u7f6e\u4fdd\u5b58\u540e\u8bbe\u7f6e\u751f\u6548\u3002

    "},{"location":"user_manual/dataset/dataset/#24","title":"2.4 \u5bfc\u51fa\u77e5\u8bc6\u5e93","text":"

    \u5728\u77e5\u8bc6\u5e93\u5217\u8868\uff0c\u70b9\u51fb\u77e5\u8bc6\u5e93\u9762\u677f\u7684\u3010\u5bfc\u51fa Excel\u3011/\u3010\u5bfc\u51fa ZIP\u3011\u3002\u5c06\u77e5\u8bc6\u5e93\u7684\u5206\u6bb5\u5185\u5bb9\u4ee5 Excel \u6216 ZIP \u6587\u4ef6\u683c\u5f0f\u5bfc\u51fa\u3002 \u6bcf\u4e2a\u6587\u6863\u4e3a Excel \u6587\u4ef6\u7684\u4e00\u4e2a Sheet\uff0cSheet \u6bcf\u4e00\u884c\u5c55\u793a\u4e00\u4e2a\u5206\u6bb5\u3002\u5bfc\u51fa ZIP \u6587\u4ef6\u65f6\uff0c\u4f1a\u5c06\u5f15\u7528\u7684\u56fe\u7247\u4e00\u8d77\u5bfc\u51fa\uff0c\u4e14\u4ee5 guid \u7684\u65b9\u5f0f\u8fdb\u884c\u547d\u540d\uff0c\u4e14\u6ca1\u6709\u683c\u5f0f\u6269\u5c55\u540d\u3002

    "},{"location":"user_manual/dataset/dataset/#25","title":"2.5 \u5bfc\u5165\u77e5\u8bc6\u5e93","text":"

    \u5bfc\u5165\u77e5\u8bc6\u5e93\u65f6\uff0c\u9700\u5148\u521b\u5efa\u4e00\u4e2a\u901a\u7528\u77e5\u8bc6\u5e93\uff0c\u70b9\u51fb\u3010\u4e0a\u4f20\u6587\u6863\u3011\uff0c\u9009\u62e9\u3010QA \u95ee\u7b54\u5bf9\u3011\uff0c\u4e0a\u4f20\u77e5\u8bc6\u5e93\u5bfc\u51fa\u7684\u6587\u6863\uff0c\u70b9\u51fb\u3010\u5f00\u59cb\u5bfc\u5165\u3011\u3002

    "},{"location":"user_manual/dataset/dataset/#26","title":"2.6 \u5220\u9664\u77e5\u8bc6\u5e93","text":"

    \u5728\u77e5\u8bc6\u5e93\u5217\u8868\uff0c\u70b9\u51fb\u77e5\u8bc6\u5e93\u9762\u677f\u7684\u3010\u5220\u9664\u3011\u5bf9\u77e5\u8bc6\u5e93\u8fdb\u884c\u5220\u9664\u64cd\u4f5c\u3002

    \u6ce8\u610f\uff1a\u77e5\u8bc6\u5e93\u5220\u9664\u540e\u65e0\u6cd5\u6062\u590d\uff0c\u8bf7\u8c28\u614e\u64cd\u4f5c\u3002

    "},{"location":"user_manual/dataset/doclist/","title":"\u6587\u6863","text":"

    MaxKB \u77e5\u8bc6\u5e93\u6587\u6863\u652f\u6301\u540c\u6b65\u3001\u91cd\u65b0\u5411\u91cf\u5316\u3001\u751f\u6210\u95ee\u9898\u3001\u8f6c\u79fb\u3001\u8bbe\u7f6e\u3001\u5bfc\u51fa\u4ee5\u53ca\u5220\u9664\u64cd\u4f5c\u3002

    "},{"location":"user_manual/dataset/doclist/#1","title":"1 \u6587\u6863\u4e0a\u4f20","text":"

    \u5bf9\u4e8e\u901a\u7528\u578b\u77e5\u8bc6\u5e93\uff0c\u70b9\u51fb\u3010\u4e0a\u4f20\u6587\u6863\u3011\u8fdb\u5165\u4e0a\u4f20\u6587\u6863\u9875\u9762\uff0c\u53ef\u4ee5\u62d6\u62fd\u6587\u4ef6\u6216\u9009\u62e9\u6587\u4ef6/\u6587\u4ef6\u5939\u8fdb\u884c\u4e0a\u4f20\u3002 \u652f\u6301\u7684\u6587\u4ef6\u683c\u5f0f\u5305\u62ec\uff1aTXT\u3001Markdown\u3001PDF\u3001DOCX\u3001HTML\u3001XLS\u3001XLSX\u3001CSV\u3001ZIP\u3002\u5982\u679c\u9009\u62e9\u6587\u4ef6\u5939\uff0c\u5c06\u901a\u8fc7\u6587\u4ef6\u540e\u7f00\u8fdb\u884c\u81ea\u52a8\u8fc7\u6ee4\uff0c\u6bcf\u6b21\u6700\u591a\u4e0a\u4f20 50 \u4e2a\u6587\u4ef6\uff0c\u4e14\u5355\u4e2a\u6587\u4ef6\u4e0d\u8d85\u8fc7 100 MB\u3002

    \u5bf9\u4e8e Web \u7ad9\u70b9\u77e5\u8bc6\u5e93\uff0c\u70b9\u51fb\u3010\u5bfc\u5165\u6587\u6863\u3011\u6253\u5f00\u5bf9\u8bdd\u6846\uff0c\u8f93\u5165\u6587\u6863\u94fe\u63a5 URL \u5730\u5740\u548c\u9009\u62e9\u5668\uff0c\u5373\u53ef\u540c\u6b65\u5bf9\u5e94\u5185\u5bb9\u3002

    "},{"location":"user_manual/dataset/doclist/#2","title":"2 \u6587\u6863\u540c\u6b65","text":"

    Web \u7ad9\u70b9\u77e5\u8bc6\u5e93\u652f\u6301\u5bf9\u9009\u4e2d\u6587\u6863\u8fdb\u884c\u540c\u6b65\u64cd\u4f5c\u3002\u540c\u6b65\u65f6\u4f1a\u5148\u5220\u9664\u5f53\u524d\u6587\u6863\u4e0b\u7684\u6240\u6709\u5206\u6bb5\uff0c\u5e76\u91cd\u65b0\u83b7\u53d6\u6587\u6863\u5730\u5740\u7684\u6587\u672c\u6570\u636e\u540e\u91cd\u65b0\u5206\u6bb5\u3002

    "},{"location":"user_manual/dataset/doclist/#3","title":"3 \u8bbe\u7f6e","text":"

    \u547d\u4e2d\u5904\u7406\u65b9\u5f0f\uff1a

    • \u6a21\u578b\u4f18\u5316\uff1a\u63d0\u95ee\u65f6\u547d\u4e2d\u8be5\u6587\u6863\u4e0b\u9762\u7684\u5206\u6bb5\u540e\uff0c\u4f1a\u6309\u7167\u5e94\u7528\u7684\u63d0\u793a\u8bcd\u751f\u6210 prompt \u53d1\u9001\u7ed9\u6a21\u578b\u4f18\u5316\u540e\u8fd4\u56de\u7b54\u6848\u3002
    • \u76f4\u63a5\u56de\u7b54\uff1a\u63d0\u95ee\u65f6\u547d\u4e2d\u8be5\u6587\u6863\u4e0b\u9762\u7684\u5206\u6bb5\u540e\uff0c\u82e5\u76f8\u4f3c\u5ea6\u7b26\u5408\u8bbe\u7f6e\u5219\u76f4\u63a5\u8fd4\u56de\u5206\u6bb5\u5185\u5bb9\u3002\u5bf9\u4e8e\u9700\u8981\u5c06\u56fe\u7247\u3001\u94fe\u63a5\u7b49\u4fe1\u606f\u8fd4\u56de\u8981\u6c42\uff0c\u5efa\u8bae\u4f7f\u7528\u6b64\u65b9\u5f0f\u3002

    \u5141\u8bb8\u5728\u77e5\u8bc6\u5e93\u6765\u6e90\u4e2d\u4e0b\u8f7d\uff1a \u901a\u7528\u77e5\u8bc6\u5e93\u548c\u98de\u4e66\u77e5\u8bc6\u5e93\u7684\u6587\u6863\u652f\u6301\u9009\u62e9\u662f\u5426\u3010\u5141\u8bb8\u5728\u77e5\u8bc6\u6765\u6e90\u4e2d\u4e0b\u8f7d\u3011\u7684\u8bbe\u7f6e\u529f\u80fd\uff0c\u52fe\u9009\u540e\uff0c\u5305\u542b\u8be5\u77e5\u8bc6\u5e93\u6587\u6863\u7684\u5e94\u7528\uff0c\u56de\u7b54\u5185\u5bb9\u5c06\u4e0d\u652f\u6301\u4e0b\u8f7d\u77e5\u8bc6\u6765\u6e90\u3002

    "},{"location":"user_manual/dataset/doclist/#4","title":"4 \u751f\u6210\u95ee\u9898","text":"

    \u9009\u4e2d\u6587\u6863\uff0c\u70b9\u51fb\u3010\u751f\u6210\u95ee\u9898\u3011\u6309\u94ae\u6216\u6267\u884c\u751f\u6210\u95ee\u9898\u64cd\u4f5c\uff0c\u5c06\u901a\u8fc7 AI \u6a21\u578b\uff08\u652f\u6301\u8bbe\u7f6e\u6a21\u578b\u53c2\u6570\uff09\uff0c\u6839\u636e\u6587\u4ef6\u5185\u5bb9\u603b\u7ed3\u751f\u6210\u5bf9\u5e94\u7684\u95ee\u9898\uff0c\u5e76\u81ea\u52a8\u5173\u8054\u3002

    "},{"location":"user_manual/dataset/doclist/#5","title":"5 \u6587\u6863\u8fc1\u79fb","text":"

    \u9009\u4e2d\u6587\u6863\uff0c\u70b9\u51fb\u3010\u8fc1\u79fb\u3011\u6309\u94ae\uff0c\u5c06\u6587\u6863\u8fc1\u79fb\u5230\u5176\u5b83\u77e5\u8bc6\u5e93\u3002

    "},{"location":"user_manual/dataset/doclist/#6-excelzip","title":"6 \u5bfc\u51fa Excel/ZIP","text":"

    \u9009\u4e2d\u6587\u6863\uff0c\u6267\u884c\u5bfc\u51fa Excel/\u5bfc\u51fa Zip \u64cd\u4f5c\uff0c\u5c06\u6587\u6863\u4e0b\u8f7d\u5230\u672c\u5730\u5ba2\u6237\u7aef\u3002

    "},{"location":"user_manual/dataset/doclist/#7","title":"7 \u4e0b\u8f7d\u539f\u6587\u6863","text":"

    \u9009\u4e2d\u6587\u6863\uff0c\u70b9\u51fb\u3010\u4e0b\u8f7d\u539f\u6587\u6863\u3011\uff0c\u53ef\u4ee5\u5c06\u539f\u6587\u6863\u4e0b\u8f7d\u5230\u672c\u5730\uff0c\u4fdd\u7559\u539f\u59cb\u6587\u4ef6\u3002

    \u6ce8\u610f\uff1a\u4e0b\u8f7d\u539f\u6587\u6863\u529f\u80fd\u4ec5\u5141\u8bb8\u624b\u52a8\u5728\u3010\u4e0a\u4f20\u6587\u6863\u3011\u4e2d\u4e0a\u4f20\u7684\u6587\u4ef6\uff0c\u5426\u5219\u4f1a\u51fa\u73b0\u62a5\u9519\uff1a\u6587\u4ef6\u4e0d\u5b58\u5728\uff0c\u4ec5\u652f\u6301\u624b\u52a8\u4e0a\u4f20\u7684\u6587\u6863\u3002

    "},{"location":"user_manual/dataset/doclist/#8","title":"8 \u6587\u6863\u5220\u9664","text":"

    \u9009\u4e2d\u6587\u6863\uff0c\u70b9\u51fb\u5220\u9664\u6309\u94ae\u6216\u6267\u884c\u5220\u9664\u64cd\u4f5c\uff0c\u5bf9\u9009\u4e2d\u6587\u6863\u8fdb\u884c\u5220\u9664\u3002

    "},{"location":"user_manual/dataset/doclist/#9","title":"9 \u6587\u6863\u542f\u7528\u4e0e\u7981\u7528","text":"

    \u5728\u6587\u6863\u5217\u8868\u4e2d\u7684\u5176\u4e2d\u72b6\u6001\u5217\uff0c\u53ef\u5bf9\u6587\u6863\u6267\u884c\u542f\u7528\u6216\u7981\u7528\u64cd\u4f5c\u3002\u6587\u6863\u7981\u7528\u540e\uff0c\u5f53\u7528\u6237\u63d0\u95ee\u65f6\u7cfb\u7edf\u4e0d\u4f1a\u68c0\u7d22\u8be5\u6587\u6863\u4e0b\u7684\u5206\u6bb5\u5185\u5bb9\uff0c\u9700\u8981\u91cd\u65b0\u542f\u7528\u540e\u7cfb\u7edf\u624d\u4f1a\u68c0\u7d22\u3002

    "},{"location":"user_manual/dataset/doclist/#10","title":"10 \u5206\u6bb5\u7ba1\u7406","text":"

    \u5bfc\u5165\u6587\u6863\u540e\uff0c\u7cfb\u7edf\u6839\u636e\u5206\u6bb5\u89c4\u5219\u8fdb\u884c\u5206\u6bb5\u64cd\u4f5c\u3002\u70b9\u51fb\u6587\u6863\u5217\u8868\u4e2d\u7684\u6587\u6863\uff0c\u8fdb\u5165\u6587\u6863\u5206\u6bb5\u7ba1\u7406\u9875\u9762\uff0c\u53ef\u6dfb\u52a0\u3001\u7f16\u8f91\u3001\u8fc1\u79fb\u3001\u5220\u9664\u3001\u542f\u7528/\u7981\u7528\u5206\u6bb5\u4ee5\u53ca\u4e3a\u5206\u6bb5\u6dfb\u52a0\u5173\u8054\u95ee\u9898\u3002

    "},{"location":"user_manual/dataset/doclist/#101","title":"10.1 \u6dfb\u52a0\u5206\u6bb5","text":"

    \u70b9\u51fb\u3010\u6dfb\u52a0\u3011\uff0c\u5f39\u51fa\u6dfb\u52a0\u5206\u6bb5\u5bf9\u8bdd\u6846\uff0c\u586b\u5199\u5206\u6bb5\u6807\u9898\u3001\u5206\u6bb5\u5185\u5bb9\uff08\u652f\u6301 Markdown \u6837\u5f0f\u7f16\u8f91\u5206\u6bb5\u5185\u5bb9\uff09\u548c\u5173\u8054\u95ee\u9898\uff0c\u70b9\u51fb\u3010\u63d0\u4ea4\u3011\u540e\u5219\u65b0\u589e\u4e00\u4e2a\u5206\u6bb5\u3002 \u5efa\u8bae\uff1a \u4e3a\u4e86\u80fd\u51c6\u786e\u5339\u914d\u5230\u5206\u6bb5\uff0c\u5efa\u8bae\u4e3a\u5206\u6bb5\u8bbe\u7f6e\u5173\u8054\u95ee\u9898\uff0c\u8fd9\u6837\u4f1a\u4f18\u5148\u5339\u914d\u5173\u8054\u95ee\u9898\uff0c\u7136\u540e\u518d\u6620\u5c04\u5206\u6bb5\u5185\u5bb9\uff0c\u4ece\u800c\u63d0\u9ad8\u5339\u914d\u6548\u7387\u548c\u51c6\u786e\u5ea6\u3002

    "},{"location":"user_manual/dataset/doclist/#102","title":"10.2 \u7f16\u8f91\u5206\u6bb5","text":"

    \u70b9\u51fb\u5206\u6bb5\u9762\u677f\uff0c\u5728\u5206\u6bb5\u8be6\u60c5\u9875\u9762\u5bf9\u5df2\u5206\u6bb5\u7684\u4fe1\u606f\u8fdb\u884c\u7f16\u8f91\u548c\u5173\u8054\u95ee\u9898\u64cd\u4f5c\u3002

    "},{"location":"user_manual/dataset/doclist/#103","title":"10.3 \u8fc1\u79fb\u5206\u6bb5","text":"

    \u5728\u5206\u6bb5\u9762\u677f\u4e2d\u53ef\u4ee5\u5bf9\u9009\u4e2d\u5206\u6bb5\u8fc1\u79fb\u5230\u5176\u5b83\u77e5\u8bc6\u5e93\u7684\u6587\u6863\u4e2d\u3002

    "},{"location":"user_manual/dataset/doclist/#104","title":"10.4 \u5220\u9664\u5206\u6bb5","text":"

    \u5728\u5206\u6bb5\u9762\u677f\u4e2d\u53ef\u4ee5\u5bf9\u9009\u4e2d\u5206\u6bb5\u8fdb\u884c\u5220\u9664\u3002

    "},{"location":"user_manual/dataset/hit-testing/","title":"\u547d\u4e2d\u6d4b\u8bd5","text":"

    \u77e5\u8bc6\u5e93\u547d\u4e2d\u6d4b\u8bd5\u662f\u5bf9\u63d0\u95ee\u8fdb\u884c\u63d0\u524d\u9a8c\u8bc1\uff0c\u70b9\u51fb\u3010\u547d\u4e2d\u6d4b\u8bd5\u3011\uff0c\u8f93\u5165\u6d4b\u8bd5\u95ee\u9898\uff0c\u7cfb\u7edf\u5728\u5f53\u524d\u77e5\u8bc6\u5e93\u4e2d\u5411\u91cf\u68c0\u7d22\u4e0e\u95ee\u9898\u76f8\u5173\u7684\u5206\u6bb5\uff0c\u7136\u540e\u6309\u7167\u76f8\u4f3c\u5ea6\u548c\u8fd4\u56de Top \u5206\u6bb5\u6570\u7b49\u53c2\u6570\u8fd4\u56de\u547d\u4e2d\u7ed3\u679c\uff0c\u53ef\u4ee5\u6839\u636e\u547d\u4e2d\u6d4b\u8bd5\u8fd4\u56de\u5206\u6bb5\u5185\u5bb9\uff0c\u5bf9\u5206\u6bb5\u8fdb\u884c\u518d\u6b21\u7f16\u8f91\u6216\u6dfb\u52a0\u5173\u8054\u95ee\u9898\uff0c\u4ee5\u8fdb\u4e00\u6b65\u63d0\u5347\u548c\u4f18\u5316\u56de\u7b54\u6548\u679c\u3002

    \u53c2\u6570\u8bbe\u7f6e\u8bf4\u660e

    • \u68c0\u7d22\u6a21\u5f0f\uff1a\u5f53\u524d\u652f\u6301\u5411\u91cf\u68c0\u7d22\u3001\u5168\u6587\u68c0\u7d22\u548c\u6df7\u5408\u68c0\u7d22 3 \u79cd\u68c0\u7d22\u6a21\u5f0f\u3002
      • \u5411\u91cf\u68c0\u7d22\uff1a\u4f7f\u7528\u5411\u91cf\u6a21\u578b\u901a\u8fc7\u5411\u91cf\u8ddd\u79bb\u8ba1\u7b97\u4e0e\u7528\u6237\u95ee\u9898\u6700\u76f8\u4f3c\u7684\u6587\u672c\u5206\u6bb5\u3002
      • \u5168\u6587\u68c0\u7d22\uff1a\u901a\u8fc7\u5173\u952e\u8bcd\u68c0\u7d22\uff0c\u8fd4\u56de\u5305\u542b\u5173\u952e\u8bcd\u6700\u591a\u7684\u6587\u672c\u5206\u6bb5\u3002
      • \u6df7\u5408\u68c0\u7d22\uff1a\u540c\u65f6\u6267\u884c\u5168\u6587\u68c0\u7d22\u548c\u5411\u91cf\u68c0\u7d22\uff0c\u518d\u8fdb\u884c\u91cd\u6392\u5e8f\uff0c\u4ece\u4e24\u7c7b\u67e5\u8be2\u7ed3\u679c\u4e2d\u9009\u62e9\u5339\u914d\u7528\u6237\u95ee\u9898\u7684\u6700\u4f73\u7ed3\u679c\u3002
    • \u76f8\u4f3c\u5ea6\uff1a\u76f8\u4f3c\u5ea6\u8d8a\u9ad8\u4ee3\u8868\u95ee\u9898\u548c\u5206\u6bb5\u7684\u76f8\u5173\u6027\u8d8a\u5f3a\u3002
    • \u8fd4\u56de\u5206\u6bb5\u6570 TOP \uff1a \u8fd4\u56de\u7b26\u5408\u6761\u4ef6\u7684 Top N \u4e2a\u5206\u6bb5\u3002

    "},{"location":"user_manual/dataset/problem/","title":"\u95ee\u9898","text":"

    MaxKB \u77e5\u8bc6\u5e93\u7ba1\u7406\u6743\u9650\u7528\u6237\u53ef\u4ee5\u6536\u96c6\u7528\u6237\u53ef\u80fd\u63d0\u51fa\u7684\u76f8\u5173\u95ee\u9898\uff0c\u521b\u5efa\u95ee\u9898\u5e76\u5173\u8054\u77e5\u8bc6\u5e93\u6587\u6863\u4e2d\u7684\u5185\u5bb9\uff0c\u7ef4\u62a4\u77e5\u8bc6\u5e93\u5e38\u89c1\u95ee\u9898\u5217\u8868\uff0c\u4ee5\u63d0\u9ad8\u95ee\u7b54\u7684\u51c6\u786e\u5ea6\u3002

    "},{"location":"user_manual/dataset/problem/#1","title":"1 \u521b\u5efa\u95ee\u9898","text":"

    \u70b9\u51fb\u3010\u521b\u5efa\u95ee\u9898\u3011\uff0c\u5206\u884c\u8f93\u5165\u95ee\u9898\u5217\u8868\u3002

    "},{"location":"user_manual/dataset/problem/#2","title":"2 \u95ee\u9898\u5173\u8054\u5206\u6bb5","text":"

    \u95ee\u9898\u6dfb\u52a0\u5b8c\u6210\u540e\uff0c\u53ef\u4ee5\u4e0e\u6587\u6863\u4e2d\u7684\u5206\u6bb5\u8fdb\u884c\u5173\u8054\uff0c\u5f53\u7528\u6237\u63d0\u95ee\u65f6\u4f1a\u4f18\u5148\u5339\u914d\u95ee\u9898\u5e93\u6765\u67e5\u8be2\u76f8\u5173\u7684\u5206\u6bb5\u3002

    "},{"location":"user_manual/dataset/problem/#3","title":"3 \u95ee\u9898\u8be6\u60c5","text":"

    \u70b9\u51fb\u95ee\u9898\u67e5\u770b\u8be6\u60c5\uff0c\u53ef\u5bf9\u5206\u6bb5\u5185\u5bb9\u8fdb\u884c\u4fee\u6539\u6216\u53d6\u6d88\u5173\u8054\u5173\u7cfb\u3002

    "},{"location":"user_manual/model/Regolo_model/","title":"\u5bf9\u63a5Regolo","text":""},{"location":"user_manual/model/Regolo_model/#1","title":"1 \u6dfb\u52a0\u6a21\u578b","text":"

    \u6dfb\u52a0 Regolo \u5927\u6a21\u578b\u4e4b\u524d\uff0c\u9700\u8981\u5148\u5728 Regolo AI \u521b\u5efa API Key\u3002

    \u9009\u62e9\u6a21\u578b\u4f9b\u5e94\u5546\u4e3aRegolo\uff0c\u5e76\u5728\u6a21\u578b\u6dfb\u52a0\u5bf9\u8bdd\u6846\u4e2d\u8f93\u5165\u5982\u4e0b\u5fc5\u8981\u4fe1\u606f\uff1a

    • \u6a21\u578b\u540d\u79f0\uff1aMaxKB \u4e2d\u81ea\u5b9a\u4e49\u7684\u6a21\u578b\u540d\u79f0\u3002
    • \u6a21\u578b\u7c7b\u578b\uff1a\u5927\u8bed\u8a00\u6a21\u578b/\u5411\u91cf\u6a21\u578b/\u56fe\u7247\u751f\u6210\u3002
    • \u57fa\u7840\u6a21\u578b\uff1a\u4e0d\u540c\u7c7b\u578b\u6a21\u578b\u4e0b\u7684\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u4e0b\u62c9\u9009\u9879\u662f\u5e38\u7528\u7684\u4e00\u4e9b\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u652f\u6301\u81ea\u5b9a\u4e49\u8f93\u5165\u3002
    • API Key\uff1a\u83b7\u53d6 API Key\u3002
    "},{"location":"user_manual/model/Regolo_model/#2","title":"2 \u914d\u7f6e\u6837\u4f8b","text":"

    Regolo-\u5927\u8bed\u8a00\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\uff1a

    "},{"location":"user_manual/model/X-Infer_model/","title":"\u5bf9\u63a5Xorbits Inference","text":""},{"location":"user_manual/model/X-Infer_model/#1","title":"1 \u6dfb\u52a0\u6a21\u578b","text":"

    \u9009\u62e9\u6a21\u578b\u4f9b\u5e94\u5546\u4e3aXorbits Inference\uff0c\u5e76\u5728\u6a21\u578b\u6dfb\u52a0\u5bf9\u8bdd\u6846\u4e2d\u8f93\u5165\u5982\u4e0b\u5fc5\u8981\u4fe1\u606f\uff1a

    • \u6a21\u578b\u540d\u79f0\uff1aMaxKB \u4e2d\u81ea\u5b9a\u4e49\u7684\u6a21\u578b\u540d\u79f0\u3002
    • \u6a21\u578b\u7c7b\u578b\uff1a\u5927\u8bed\u8a00\u6a21\u578b/\u5411\u91cf\u6a21\u578b/\u91cd\u6392\u6a21\u578b/\u8bed\u97f3\u8bc6\u522b/\u8bed\u97f3\u5408\u6210/\u89c6\u89c9\u6a21\u578b/\u56fe\u7247\u751f\u6210\u3002
    • \u57fa\u7840\u6a21\u578b\uff1a\u4e0d\u540c\u7c7b\u578b\u6a21\u578b\u4e0b\u7684\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u4e0b\u62c9\u9009\u9879\u662f\u5e38\u7528\u7684\u4e00\u4e9b\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u652f\u6301\u81ea\u5b9a\u4e49\u8f93\u5165\u3002

    \u5927\u8bed\u8a00\u6a21\u578b\u548c\u91cd\u6392\u6a21\u578b\u9700\u8981\u8f93\u5165 API \u57df\u540d\u548c API Key\uff0c\u5411\u91cf\u6a21\u578b\u9700\u8981\u8f93\u5165 API \u57df\u540d\u3002

    • API \u57df\u540d\uff1aXorbits Inference \u670d\u52a1\u5730\u5740\uff0c\u4f8b\u5982\uff1ahttp://192.168.20.242:9997 \u3002
    • API Key\uff1a\u82e5\u6ca1\u6709 API Key\uff0c\u8f93\u5165\u4efb\u610f\u5b57\u7b26\u5373\u53ef\u3002
    "},{"location":"user_manual/model/X-Infer_model/#2","title":"2 \u914d\u7f6e\u6837\u4f8b","text":"

    Xorbits Inference-\u5927\u8bed\u8a00\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    Xorbits Inference-\u5411\u91cf\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    Xorbits Inference-\u91cd\u6392\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    Xorbits Inference-\u8bed\u97f3\u8bc6\u522b\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    Xorbits Inference-\u8bed\u97f3\u5408\u6210\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    Xorbits Inference-\u89c6\u89c9\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    Xorbits Inference-\u56fe\u7247\u751f\u6210\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    "},{"location":"user_manual/model/amazon_bedrock_model/","title":"\u5bf9\u63a5Amazon Bedrock","text":""},{"location":"user_manual/model/amazon_bedrock_model/#1","title":"1 \u6dfb\u52a0\u6a21\u578b","text":"

    \u9009\u62e9\u6a21\u578b\u4f9b\u5e94\u5546\u4e3aAmazon Bedrock\uff0c\u5e76\u5728\u6a21\u578b\u6dfb\u52a0\u5bf9\u8bdd\u6846\u4e2d\u8f93\u5165\u5982\u4e0b\u5fc5\u8981\u4fe1\u606f\uff1a

    • \u6a21\u578b\u540d\u79f0\uff1aMaxKB \u4e2d\u81ea\u5b9a\u4e49\u7684\u6a21\u578b\u540d\u79f0\u3002
    • \u6743\u9650\uff1a\u5206\u4e3a\u79c1\u6709\u548c\u516c\u7528\u4e24\u79cd\u6743\u9650\uff0c\u79c1\u6709\u6a21\u578b\u4ec5\u5f53\u524d\u7528\u6237\u53ef\u7528\uff0c\u516c\u7528\u6a21\u578b\u5373\u7cfb\u7edf\u5185\u6240\u6709\u7528\u6237\u5747\u53ef\u4f7f\u7528\uff0c\u4f46\u5176\u5b83\u7528\u6237\u4e0d\u80fd\u7f16\u8f91\u548c\u5220\u9664\u3002
    • \u6a21\u578b\u7c7b\u578b\uff1a\u5927\u8bed\u8a00\u6a21\u578b/\u5411\u91cf\u5927\u6a21\u578b\u3002
    • \u57fa\u7840\u6a21\u578b\uff1aAmazon Bedrock \u652f\u6301\u7684 LLM \u6a21\u578b\u540d\u79f0\uff0c\u4e0b\u62c9\u9009\u9879\u662f\u5e38\u7528\u7684\u4e00\u4e9b\u5927\u8bed\u8a00\u6a21\u578b\u540d\u79f0\uff0c\u652f\u6301\u81ea\u5b9a\u4e49\u8f93\u5165\u3002
    • Region Name\uff1a\u6a21\u578b\u5f00\u901a\u7684\u533a\u57df\u3002
    • Access Key ID/Secret Access Key: Access Key ID \u548c Secret Access Key \u662f\u7528\u4e8e\u5bf9 AWS \u670d\u52a1\uff08\u5305\u62ec Amazon Bedrock\uff09\u7684\u7f16\u7a0b\u8bbf\u95ee\u8fdb\u884c\u8eab\u4efd\u9a8c\u8bc1\u7684\u51ed\u8bc1\u3002
    "},{"location":"user_manual/model/amazon_bedrock_model/#2","title":"2 \u914d\u7f6e\u6837\u4f8b","text":"

    Amazon Bedrock-\u5927\u8bed\u8a00\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\uff1a

    "},{"location":"user_manual/model/anthropic_model/","title":"\u5bf9\u63a5Anthropic","text":""},{"location":"user_manual/model/anthropic_model/#1","title":"1 \u6dfb\u52a0\u6a21\u578b","text":"

    \u6dfb\u52a0 Anthropic \u6a21\u578b\u4e4b\u524d\uff0c\u9700\u8981\u6ce8\u518c\u5e76\u5728\u63a7\u5236\u53f0\u4e2d\u7684\u3010\u8d26\u6237\u7ba1\u7406-API \u5bc6\u94a5\u3011\u4e2d\u521b\u5efa API Key\u3002

    \u9009\u62e9\u6a21\u578b\u4f9b\u5e94\u5546\u4e3aAnthropic\uff0c\u5e76\u5728\u6a21\u578b\u6dfb\u52a0\u5bf9\u8bdd\u6846\u4e2d\u8f93\u5165\u5982\u4e0b\u5fc5\u8981\u4fe1\u606f\uff1a

    • \u6a21\u578b\u540d\u79f0\uff1aMaxKB \u4e2d\u81ea\u5b9a\u4e49\u7684\u6a21\u578b\u540d\u79f0\u3002
    • \u6a21\u578b\u7c7b\u578b\uff1a\u5927\u8bed\u8a00\u6a21\u578b/\u89c6\u89c9\u6a21\u578b\u3002
    • \u57fa\u7840\u6a21\u578b\uff1aAnthropic \u652f\u6301\u7684\u5404\u7c7b\u6a21\u578b\u7684\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u9009\u9879\u4e2d\u663e\u793a\u4e86 Anthropic \u652f\u6301\u7684\u90e8\u5206\u5e38\u7528\u5927\u8bed\u8a00\u6a21\u578b\u540d\u79f0\uff0c\u652f\u6301\u624b\u52a8\u8f93\u5165\u9700\u8981\u4e0e Anthropic \u652f\u6301\u7684\u6a21\u578b\u540d\u79f0\u4fdd\u6301\u4e00\u81f4\uff0c\u5426\u5219\u65e0\u6cd5\u901a\u8fc7\u6821\u9a8c\u3002
    • API URL\uff1ahttps://api.anthropic.com/v1/messages
    • API Key\uff1a\u5728 anthropic \u63a7\u5236\u53f0\u521b\u5efa\u7684 API Key\u3002
    "},{"location":"user_manual/model/anthropic_model/#2","title":"2 \u914d\u7f6e\u6837\u4f8b","text":"

    Anthropic-\u5927\u8bed\u8a00\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    "},{"location":"user_manual/model/azure_openai_model/","title":"\u5bf9\u63a5Azure OpenAI","text":""},{"location":"user_manual/model/azure_openai_model/#1","title":"1 \u6dfb\u52a0\u6a21\u578b","text":"

    \u6dfb\u52a0 Azure OpenAI \u5927\u6a21\u578b\u4e4b\u524d\uff0c\u9700\u8981\u5148\u5728 Azure AI Studio \u4e2d\u6ce8\u518c\uff0c\u5e76\u83b7\u53d6\u6709\u5173 API \u57df\u540d\u3001API Key\u3001\u90e8\u7f72\u8be6\u7ec6\u4fe1\u606f\u7b49\u5185\u5bb9\uff0c\u53c2\u8003\u4e0b\u56fe\uff1a

    \u9009\u62e9\u6a21\u578b\u4f9b\u5e94\u5546\u4e3aAzure OpenAI\uff0c\u5e76\u5728\u6a21\u578b\u6dfb\u52a0\u5bf9\u8bdd\u6846\u4e2d\u8f93\u5165\u5982\u4e0b\u5fc5\u8981\u4fe1\u606f\uff1a

    • \u6a21\u578b\u540d\u79f0\uff1aMaxKB \u4e2d\u81ea\u5b9a\u4e49\u7684\u6a21\u578b\u540d\u79f0\u3002
    • \u6a21\u578b\u7c7b\u578b\uff1a\u5927\u8bed\u8a00\u6a21\u578b/\u5411\u91cf\u6a21\u578b/\u8bed\u97f3\u8bc6\u522b/\u8bed\u97f3\u5408\u6210/\u89c6\u89c9\u6a21\u578b/\u56fe\u7247\u751f\u6210\u3002
    • \u57fa\u7840\u6a21\u578b\uff1a\u5177\u4f53\u7684\u57fa\u7840\u6a21\u578b\u7531\u90e8\u7f72\u540d\u51b3\u5b9a\uff0c\u89c1\u4e0a\u56fe\u3002
    • API \u7248\u672c\uff1a\u6a21\u578b\u7248\u672c
    • API \u57df\u540d\uff1aAzure OpenAI \u9879\u76ee API \u670d\u52a1 URL\uff0c\u89c1\u4e0a\u56fe\u3002
    • API Key\uff1aAzure OpenAI \u9879\u76ee API \u670d\u52a1\u8ba4\u8bc1\u9a8c\u8bc1\u4fe1\u606f\uff0c\u89c1\u4e0a\u56fe\u3002
    • \u90e8\u7f72\u540d\uff1aAzure AI Studio \u9879\u76ee\u64cd\u573a\u4e2d\u6a21\u578b\u7684\u90e8\u7f72\u540d\u79f0\u3002

    "},{"location":"user_manual/model/azure_openai_model/#2","title":"2 \u914d\u7f6e\u6837\u4f8b","text":"

    Azure OpenAI-\u5927\u8bed\u8a00\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\uff1a

    "},{"location":"user_manual/model/bailian_model/","title":"\u5bf9\u63a5\u963f\u91cc\u4e91\u767e\u70bc","text":""},{"location":"user_manual/model/bailian_model/#1","title":"1 \u6dfb\u52a0\u6a21\u578b","text":"

    \u9009\u62e9\u6a21\u578b\u4f9b\u5e94\u5546\u4e3a\u963f\u91cc\u4e91\u767e\u70bc\uff0c\u5e76\u5728\u6a21\u578b\u6dfb\u52a0\u5bf9\u8bdd\u6846\u4e2d\u8f93\u5165\u5982\u4e0b\u5fc5\u8981\u4fe1\u606f\uff1a

    • \u6a21\u578b\u540d\u79f0\uff1aMaxKB \u4e2d\u81ea\u5b9a\u4e49\u7684\u6a21\u578b\u540d\u79f0\u3002
    • \u6a21\u578b\u7c7b\u578b\uff1a\u5927\u8bed\u8a00\u6a21\u578b/\u5411\u91cf\u6a21\u578b/\u91cd\u6392\u6a21\u578b/\u8bed\u97f3\u8bc6\u522b/\u8bed\u97f3\u5408\u6210/\u89c6\u89c9\u6a21\u578b/\u56fe\u7247\u751f\u6210/\u6587\u751f\u89c6\u9891/\u56fe\u751f\u89c6\u9891\u3002
    • \u57fa\u7840\u6a21\u578b\uff1a\u4e0d\u540c\u7c7b\u578b\u6a21\u578b\u4e0b\u7684\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u4e0b\u62c9\u9009\u9879\u662f\u5e38\u7528\u7684\u4e00\u4e9b\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u652f\u6301\u81ea\u5b9a\u4e49\u8f93\u5165\u3002
    • API \u57df\u540d\uff1a\u6a21\u578b\u670d\u52a1 API \u670d\u52a1\u8bbf\u95ee\u5730\u5740\uff0c\u76ee\u524d\u5f53\u6a21\u578b\u7c7b\u578b\u662f\u5927\u8bed\u8a00\u6a21\u578b\u65f6\u9700\u8981\u8f93\u5165\u3002
    • API Key\uff1a\u6a21\u578b\u670d\u52a1 API \u670d\u52a1\u8bbf\u95ee\u5bc6\u94a5\u3002

    \u6ce8\u610f\uff1a\u4e0d\u540c\u7684\u5927\u8bed\u8a00\u6a21\u578b\u5bf9\u5e94\u7684 API \u57df\u540d\u4e0d\u4e00\u6837\uff0c\u5177\u4f53\u8bf7\u67e5\u770b\u5bf9\u5e94\u57fa\u7840\u6a21\u578b\u7684 API \u8c03\u7528\u793a\u4f8b\u3002

    "},{"location":"user_manual/model/bailian_model/#2","title":"2 \u914d\u7f6e\u6837\u4f8b","text":"

    \u963f\u91cc\u4e91\u767e\u70bc-\u5927\u8bed\u8a00\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\u3002

    \u963f\u91cc\u4e91\u767e\u70bc-\u5411\u91cf\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    \u963f\u91cc\u4e91\u767e\u70bc-\u91cd\u6392\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    \u963f\u91cc\u4e91\u767e\u70bc\u8bed\u97f3\u8bc6\u522b\u6a21\u578b\u9664\u4e86\u652f\u6301 ASR\u3001Paraformer\u6a21\u578b\u5916\uff0c\u8fd8\u652f\u6301 qwen-omni-turbo\u3001qwen2.5-omni-7b \u5168\u6a21\u6001\u6a21\u578b\u3002

    \u963f\u91cc\u4e91\u767e\u70bc-\u8bed\u97f3\u8bc6\u522b\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    \u963f\u91cc\u4e91\u767e\u70bc-\u8bed\u97f3\u5408\u6210\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    \u963f\u91cc\u4e91\u767e\u70bc-\u89c6\u89c9\u6a21\u578b\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    \u963f\u91cc\u4e91\u767e\u70bc-\u56fe\u7247\u751f\u6210\u6a21\u578b\u9ed8\u8ba4\u56fe\u50cf\u5c3a\u5bf8\u4e3a 1024 * 1024\uff0c\u56fe\u7247\u6570\u91cf 1 \u5f20\uff0c\u98ce\u683c\u4e3a <auto>\uff0c\u5373\u7531\u6a21\u578b\u968f\u673a\u8f93\u51fa\u56fe\u50cf\u98ce\u683c\uff0c\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    \u963f\u91cc\u4e91\u767e\u70bc-\u6587\u751f\u89c6\u9891\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    \u963f\u91cc\u4e91\u767e\u70bc-\u56fe\u751f\u89c6\u9891\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    "},{"location":"user_manual/model/deepseek_model/","title":"\u5bf9\u63a5DeepSeek","text":""},{"location":"user_manual/model/deepseek_model/#1","title":"1 \u6dfb\u52a0\u6a21\u578b","text":"

    \u6dfb\u52a0 DeepSeek \u5927\u6a21\u578b\u4e4b\u524d\uff0c\u9700\u8981\u5148\u5728 DeepSeek \u5f00\u653e\u5e73\u53f0 \u521b\u5efa API Key\u3002

    \u9009\u62e9\u6a21\u578b\u4f9b\u5e94\u5546\u4e3aDeepSeek\uff0c\u5e76\u5728\u6a21\u578b\u6dfb\u52a0\u5bf9\u8bdd\u6846\u4e2d\u8f93\u5165\u5982\u4e0b\u5fc5\u8981\u4fe1\u606f\uff1a

    • \u6a21\u578b\u540d\u79f0\uff1aMaxKB \u4e2d\u81ea\u5b9a\u4e49\u7684\u6a21\u578b\u540d\u79f0\u3002
    • \u6a21\u578b\u7c7b\u578b\uff1a\u5927\u8bed\u8a00\u6a21\u578b\u3002
    • \u57fa\u7840\u6a21\u578b\uff1a\u4e0d\u540c\u7c7b\u578b\u6a21\u578b\u4e0b\u7684\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u4e0b\u62c9\u9009\u9879\u662f\u5e38\u7528\u7684\u4e00\u4e9b\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u652f\u6301\u81ea\u5b9a\u4e49\u8f93\u5165\u3002
    • API Key\uff1a\u5728 DeepSeek \u5f00\u653e\u5e73\u53f0\u521b\u5efa\u5e76\u67e5\u770b\u3002

    "},{"location":"user_manual/model/deepseek_model/#2","title":"2 \u914d\u7f6e\u6837\u4f8b","text":"

    DeepSeek-\u5927\u8bed\u8a00\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\uff1a

    "},{"location":"user_manual/model/doubao_model/","title":"\u5bf9\u63a5\u706b\u5c71\u5f15\u64ce","text":""},{"location":"user_manual/model/doubao_model/#1","title":"1 \u6dfb\u52a0\u6a21\u578b","text":"

    \u9009\u62e9\u6a21\u578b\u4f9b\u5e94\u5546\u4e3a\u706b\u5c71\u5f15\u64ce\uff0c\u5e76\u5728\u6a21\u578b\u6dfb\u52a0\u5bf9\u8bdd\u6846\u4e2d\u8f93\u5165\u5982\u4e0b\u5fc5\u8981\u4fe1\u606f\uff1a

    • \u6a21\u578b\u540d\u79f0\uff1aMaxKB \u4e2d\u81ea\u5b9a\u4e49\u7684\u6a21\u578b\u540d\u79f0\u3002
    • \u6a21\u578b\u7c7b\u578b\uff1a\u5927\u8bed\u8a00\u6a21\u578b/\u5411\u91cf\u6a21\u578b/\u8bed\u97f3\u8bc6\u522b/\u8bed\u97f3\u5408\u6210/\u89c6\u89c9\u6a21\u578b/\u56fe\u7247\u751f\u6210/\u6587\u751f\u89c6\u9891/\u56fe\u751f\u89c6\u9891\u3002

    \u8c46\u5305\u5927\u8bed\u8a00\u6a21\u578b\u5176\u5b83\u63a5\u5165\u53c2\u6570\u8bf4\u660e\uff1a

    • \u57fa\u7840\u6a21\u578b\uff1a\u5728\u7ebf\u63a8\u7406\u7684\u63a5\u5165\u70b9ID\u3002
    • API \u57df\u540d\uff1ahttps://ark.cn-beijing.volces.com/api/v3
    • API Key\uff1a\u63a5\u5165\u70b9-> API\u8c03\u7528 -> \u901a\u8fc7API Key\u6388\u6743 -> \u9009\u62e9 API Key \u590d\u5236\u83b7\u53d6\uff0c\u5982\u4e0b\u56fe

    \u8bed\u97f3\u8bc6\u522b\u548c\u8bed\u97f3\u5408\u6210\u9700\u8981\u8f93\u5165 App ID\u3001Access Token\u3001Cluster ID\uff1a

    • App \u57df\u540d\uff1a\u8bed\u97f3\u8bc6\u522b\u6a21\u578b API \u57df\u540d\u4e3awss://openspeech.bytedance.com/api/v2/asr\uff0c\u8bed\u97f3\u5408\u6210\u6a21\u578b API \u57df\u540d\u4e3awss://openspeech.bytedance.com/api/v1/tts/ws_binary
    • App ID\uff1a\u5728\u706b\u5c71\u5f15\u64ce\u4e2d\u521b\u5efa\u7684\u5e94\u7528 ID\u3002
    • Access Token\uff1a\u5728\u706b\u5c71\u5f15\u64ce\u5e94\u7528\u5bf9\u5e94\u7684\u8ba4\u8bc1\u4fe1\u606f\u3002
    • Cluster ID\uff1a\u5728\u706b\u5c71\u5f15\u64ce\u5e94\u7528\u5bf9\u5e94\u7684\u670d\u52a1\u4fe1\u606f.

    "},{"location":"user_manual/model/doubao_model/#2","title":"2 \u914d\u7f6e\u6837\u4f8b","text":"

    \u706b\u5c71\u5f15\u64ce-\u5927\u8bed\u8a00\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    \u706b\u5c71\u5f15\u64ce-\u5411\u91cf\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    \u706b\u5c71\u5f15\u64ce-\u8bed\u97f3\u8bc6\u522b\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    \u706b\u5c71\u5f15\u64ce-\u8bed\u97f3\u5408\u6210\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    \u706b\u5c71\u5f15\u64ce-\u89c6\u89c9\u6a21\u578b\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    \u706b\u5c71\u5f15\u64ce-\u56fe\u7247\u751f\u6210\u6a21\u578b\u9700\u8981\u5728\u706b\u5c71\u5f15\u64ce\u3010\u63a7\u5236\u53f0-\u8bbf\u95ee\u63a7\u5236-API \u8bbf\u95ee\u5bc6\u94a5\u3011\u65b0\u5efa\u5bc6\u94a5\uff0c\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    \u706b\u5c71\u5f15\u64ce-\u6587\u751f\u89c6\u9891\u6a21\u578b\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    \u706b\u5c71\u5f15\u64ce-\u56fe\u751f\u89c6\u9891\u6a21\u578b\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    "},{"location":"user_manual/model/gemini_model/","title":"\u5bf9\u63a5Gemini","text":""},{"location":"user_manual/model/gemini_model/#1","title":"1 \u6dfb\u52a0\u6a21\u578b","text":"

    \u6dfb\u52a0 Gemini \u5927\u6a21\u578b\u4e4b\u524d\uff0c\u9700\u8981\u5148\u5728 Google AI Studio \u521b\u5efa API Key\u3002

    \u9009\u62e9\u6a21\u578b\u4f9b\u5e94\u5546\u4e3aGemini\uff0c\u5e76\u5728\u6a21\u578b\u6dfb\u52a0\u5bf9\u8bdd\u6846\u4e2d\u8f93\u5165\u5982\u4e0b\u5fc5\u8981\u4fe1\u606f\uff1a

    • \u6a21\u578b\u540d\u79f0\uff1aMaxKB \u4e2d\u81ea\u5b9a\u4e49\u7684\u6a21\u578b\u540d\u79f0\u3002
    • \u6a21\u578b\u7c7b\u578b\uff1a\u5927\u8bed\u8a00\u6a21\u578b/\u5411\u91cf\u6a21\u578b/\u8bed\u97f3\u8bc6\u522b/\u89c6\u89c9\u6a21\u578b\u3002
    • \u57fa\u7840\u6a21\u578b\uff1a\u4e0d\u540c\u7c7b\u578b\u6a21\u578b\u4e0b\u7684\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u4e0b\u62c9\u9009\u9879\u662f\u5e38\u7528\u7684\u4e00\u4e9b\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u652f\u6301\u81ea\u5b9a\u4e49\u8f93\u5165\u3002
    • API Key\uff1a\u83b7\u53d6 API Key\u3002

    \u6ce8\u610f\uff1a \u4f7f\u7528 Gemini API \u9700\u8981\u786e\u4fdd\u7a0b\u5e8f\u6240\u5728\u670d\u52a1\u5668\u4f4d\u4e8e Gemini API \u6240\u652f\u6301\u7684\u5730\u533a \uff0c\u5426\u5219\u65e0\u6cd5\u8c03\u7528API\uff0c\u5e76\u4e14\u65e0\u6cd5\u8fdb\u5165Google AI Studio\u3002

    "},{"location":"user_manual/model/gemini_model/#2","title":"2 \u914d\u7f6e\u6837\u4f8b","text":"

    Gemini-\u5927\u8bed\u8a00\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\uff1a

    "},{"location":"user_manual/model/hunyuan_model/","title":"\u5bf9\u63a5\u817e\u8baf\u6df7\u5143","text":""},{"location":"user_manual/model/hunyuan_model/#1","title":"1 \u6dfb\u52a0\u6a21\u578b","text":"

    \u6dfb\u52a0\u817e\u8baf\u6df7\u5143\u5927\u6a21\u578b\u4e4b\u524d\uff0c\u9700\u8981\u5148\u5728\u817e\u8baf\u4e91\u5f00\u901a\u817e\u8baf\u6df7\u5143\u670d\u52a1\u5e76\u65b0\u5efa\u79d8\u94a5\u3002

    \u9009\u62e9\u6a21\u578b\u4f9b\u5e94\u5546\u4e3a\u817e\u8baf\u6df7\u5143\uff0c\u5e76\u5728\u6a21\u578b\u6dfb\u52a0\u5bf9\u8bdd\u6846\u4e2d\u8f93\u5165\u5982\u4e0b\u5fc5\u8981\u4fe1\u606f\uff1a

    • \u6a21\u578b\u540d\u79f0\uff1aMaxKB \u4e2d\u81ea\u5b9a\u4e49\u7684\u6a21\u578b\u540d\u79f0\u3002
    • \u6a21\u578b\u7c7b\u578b\uff1a\u5927\u8bed\u8a00\u6a21\u578b/\u5411\u91cf\u6a21\u578b/\u8bed\u97f3\u8bc6\u522b/\u89c6\u89c9\u6a21\u578b/\u56fe\u7247\u751f\u6210\u3002
    • \u57fa\u7840\u6a21\u578b\uff1a\u4e0d\u540c\u7c7b\u578b\u6a21\u578b\u4e0b\u7684\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u4e0b\u62c9\u9009\u9879\u662f\u5e38\u7528\u7684\u4e00\u4e9b\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u652f\u6301\u81ea\u5b9a\u4e49\u8f93\u5165\u3002
    • APPID\uff1a\u3010\u817e\u8baf\u4e91-\u63a7\u5236\u53f0-\u8bbf\u95ee\u7ba1\u7406-API \u5bc6\u94a5\u7ba1\u7406\u3011\u4e2d\u83b7\u53d6\u3002
    • SecretId\uff1a\u3010\u817e\u8baf\u4e91-\u63a7\u5236\u53f0-\u8bbf\u95ee\u7ba1\u7406-API \u5bc6\u94a5\u7ba1\u7406\u3011\u4e2d\u83b7\u53d6\u3002
    • SecretKey\uff1a\u3010\u817e\u8baf\u4e91-\u63a7\u5236\u53f0-\u8bbf\u95ee\u7ba1\u7406-API \u5bc6\u94a5\u7ba1\u7406\u3011\u65b0\u5efa\u5bc6\u94a5\u65f6\u4e0b\u8f7d\u7684 SecretKey\u3002

    "},{"location":"user_manual/model/hunyuan_model/#2","title":"2 \u914d\u7f6e\u6837\u4f8b","text":"

    \u817e\u8baf\u6df7\u5143-\u5927\u8bed\u8a00\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    \u817e\u8baf\u6df7\u5143-\u5411\u91cf\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    \u817e\u8baf\u6df7\u5143-\u8bed\u97f3\u8bc6\u522b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    \u817e\u8baf\u6df7\u5143-\u89c6\u89c9\u6a21\u578b\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    \u817e\u8baf\u6df7\u5143-\u56fe\u7247\u751f\u6210\u6a21\u578b\u9ed8\u8ba4\u56fe\u50cf\u5c3a\u5bf8\u4e3a 768 * 768\uff0c\u56fe\u7247\u6570\u91cf 1 \u5f20\uff0c\u98ce\u683c\u4e3a201\uff0c\u5373\u65e5\u7cfb\u52a8\u6f2b\u98ce\u683c\uff0c\u9ed8\u8ba4\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    "},{"location":"user_manual/model/kimi_model/","title":"\u5bf9\u63a5Kimi","text":""},{"location":"user_manual/model/kimi_model/#1","title":"1 \u6dfb\u52a0\u6a21\u578b","text":"

    \u6dfb\u52a0 Kimi \u6a21\u578b\u4e4b\u524d\uff0c\u9700\u8981\u5148\u5728 Moonshot AI \u5f00\u653e\u5e73\u53f0 \u4e2d\u6ce8\u518c\u5e76\u521b\u5efa API Key\u3002

    \u9009\u62e9\u6a21\u578b\u4f9b\u5e94\u5546\u4e3aKimi\uff0c\u5e76\u5728\u6a21\u578b\u6dfb\u52a0\u5bf9\u8bdd\u6846\u4e2d\u8f93\u5165\u5982\u4e0b\u5fc5\u8981\u4fe1\u606f\uff1a

    • \u6a21\u578b\u540d\u79f0\uff1aMaxKB \u4e2d\u81ea\u5b9a\u4e49\u7684\u6a21\u578b\u540d\u79f0\u3002
    • \u6a21\u578b\u7c7b\u578b\uff1a\u5927\u8bed\u8a00\u6a21\u578b\u3002
    • \u57fa\u7840\u6a21\u578b\uff1a\u4e0d\u540c\u7c7b\u578b\u6a21\u578b\u4e0b\u7684\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u4e0b\u62c9\u9009\u9879\u662f\u5e38\u7528\u7684\u4e00\u4e9b\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u652f\u6301\u81ea\u5b9a\u4e49\u8f93\u5165\u3002\u3002
    • API \u57df\u540d\uff1ahttps://api.moonshot.cn/v1
    • API Key\uff1a\u5728 Kimi \u8d26\u6237\u4e2d\u5fc3\u7684 API Key \u7ba1\u7406\u4e2d\u521b\u5efa\u548c\u67e5\u770b\u3002

    "},{"location":"user_manual/model/kimi_model/#2","title":"2 \u914d\u7f6e\u6837\u4f8b","text":"

    kimi-\u5927\u8bed\u8a00\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\uff1a

    "},{"location":"user_manual/model/local_model/","title":"\u5bf9\u63a5\u672c\u5730\u5927\u6a21\u578b","text":""},{"location":"user_manual/model/local_model/#1","title":"1 \u4e0b\u8f7d\u6a21\u578b","text":"

    \u524d\u63d0\u6761\u4ef6\uff1a \u5c06\u6a21\u578b\u4e0b\u8f7d\u5230\u670d\u52a1\u5668\uff0c\u5e76\u4e14\u6302\u5728\u5230 MaxKB \u5bb9\u5668\u4e2d,\u4ee5\u5411\u91cf\u6a21\u578b\u4e3a\u4f8b\u8be6\u7ec6\u8bf4\u660e\u5982\u4e0b\u3002

    • \u5c06\u5411\u91cf\u6a21\u578b\u4e0b\u8f7d\u5230\u672c\u5730\u670d\u52a1\u5668\u3002
      # \u63a8\u8350\u6a21\u578b\u4e0b\u8f7d\u7f51\u5740\nhttps://huggingface.co/models?other=text-embedding\n# \u4e0b\u8f7d\u540e\u5b58\u653e\u5728/opt/maxkb/model/local_embedding\u76ee\u5f55\u4e0b\n
    • \u4f7f\u7528-v \u5c06\u5bbf\u4e3b\u673a\u6a21\u578b\u8def\u5f84\u6302\u8f7d\u5230 MaxKB \u5bb9\u5668\u5185\u90e8\u3002
      -v /opt/maxkb/model/local_embedding:/opt/maxkb/model/local_embedding\n# \u8bf4\u660e\uff1a v \u6a21\u578b\u6240\u5728\u76ee\u5f55:MaxKB \u5bb9\u5668\u5185\u76ee\u5f55\n
    "},{"location":"user_manual/model/local_model/#2","title":"2 \u6dfb\u52a0\u6a21\u578b","text":"

    \u5728\u6a21\u578b\u7ba1\u7406\u4e2d\uff0c\u70b9\u51fb\u4f9b\u5e94\u5546\u3010\u672c\u5730\u6a21\u578b\u3011\uff0c\u76f4\u63a5\u8fdb\u5165\u4e0b\u4e00\u6b65\u586b\u5199\u672c\u5730\u6a21\u578b\u7684\u8868\u5355\u3002

    • \u6a21\u578b\u540d\u79f0\uff1aMaxKB \u4e2d\u81ea\u5b9a\u4e49\u7684\u6a21\u578b\u540d\u79f0\u3002
    • \u6a21\u578b\u7c7b\u578b\uff1a\u5411\u91cf\u6a21\u578b/\u91cd\u6392\u6a21\u578b\u3002
    • \u57fa\u7840\u6a21\u578b\uff1a\u6a21\u578b\u5728 MaxKB \u5bb9\u5668\u4e0b\u7684\u7edd\u5bf9\u8def\u5f84\u3002
    • \u6a21\u578b\u76ee\u5f55\uff1a\u6a21\u578b\u7684\u76ee\u5f55\uff08\u57fa\u7840\u6a21\u578b\u4e3a\u540d\u79f0\u65f6\uff0c\u8be5\u76ee\u5f55\u751f\u6548\uff0c\u57fa\u7840\u6a21\u578b\u82e5\u6709\u7edd\u5bf9\u8def\u5f84\uff0c\u5219\u8be5\u53c2\u6570\u4e0d\u751f\u6548\uff0c\u5efa\u8bae\u4e0e\u57fa\u7840\u6a21\u578b\u586b\u5199\u4e00\u81f4\uff09\u3002
    "},{"location":"user_manual/model/local_model/#3","title":"3 \u914d\u7f6e\u6837\u4f8b","text":"

    \u672c\u5730\u6a21\u578b-\u5411\u91cf\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    "},{"location":"user_manual/model/model_param/","title":"\u6a21\u578b\u53c2\u6570\u914d\u7f6e","text":"

    \u70b9\u51fb\u6a21\u578b\u53f3\u4e0a\u89d2\u66f4\u591a\u83dc\u5355\uff0c\u70b9\u51fb\u3010\u6a21\u578b\u53c2\u6570\u8bbe\u7f6e\u3011\uff0c\u53ef\u4ee5\u6839\u636e\u5404\u5e73\u53f0\u63d0\u4f9b\u7684\u5176\u5b83\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\u3002

    \u4ee5\u6a21\u578b\u8054\u7f51\u641c\u7d22\u53c2\u6570\u4e3a\u4f8b\uff0c\u9996\u5148\u9700\u8981\u5148\u5728\u5bf9\u5e94\u6a21\u578b\u5e73\u53f0\u5b98\u65b9 API \u6587\u6863\u627e\u5230\u6a21\u578b\u7684\u53c2\u6570\u4fe1\u606f\uff0c\u4f8b\u5982\u767e\u5ea6\u5343\u5e06\u5927\u6a21\u578b\u7684 ERNIE-4.0-8K\uff0c \u8054\u7f51\u53c2\u6570\u4e3a\uff1adisable_search\uff0c\u6253\u5f00 ERNIE-4.0-8K\u7684\u6a21\u578b\u53c2\u6570\u8bbe\u7f6e\uff0c\u6dfb\u52a0\u5173\u95ed\u5b9e\u65f6\u641c\u7d22\u53c2\u6570\u3002 \u6ce8\u610f\uff1a \u4e0d\u540c\u6a21\u578b\u8be5\u53c2\u6570\u4f1a\u6709\u5dee\u5f02\uff0c\u8bf7\u6839\u636e\u5b98\u65b9\u6587\u6863\u8fdb\u884c\u914d\u7f6e\u76f8\u5173\u53c2\u6570\u3002

    \u7136\u540e\u5728\u5e94\u7528\u7684 AI \u6a21\u578b\u53c2\u6570\u8bbe\u7f6e\u4e2d\uff0c\u8bbe\u7f6e\u5b9e\u65f6\u641c\u7d22\u529f\u80fd\u53c2\u6570\u3002

    "},{"location":"user_manual/model/model_summary/","title":"\u6a21\u578b\u6982\u8ff0","text":""},{"location":"user_manual/model/model_summary/#1","title":"1 \u529f\u80fd\u6982\u8ff0","text":"

    MaxKB \u652f\u6301\u4e0e\u591a\u79cd\u4f9b\u5e94\u5546\u6a21\u578b\u7684\u96c6\u6210\uff0c\u652f\u6301\u5bf9\u63a5\u5f53\u524d\u4e3b\u6d41\u7684\u5927\u578b\u6a21\u578b\u3002\u8fd9\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u672c\u5730\u90e8\u7f72\u7684\u79c1\u6709\u6a21\u578b\u5982 Llama 3 \u548c Qwen 2\uff0c\u56fd\u5185\u63d0\u4f9b\u7684\u516c\u5171\u6a21\u578b\u670d\u52a1\u4f8b\u5982 DeepSeek\u3001SILICONFLOW\u3001Kimi\u3001\u667a\u8c31 AI \u548c\u767e\u5ea6\u5343\u5e06\uff0c\u4ee5\u53ca\u56fd\u9645\u77e5\u540d\u7684\u516c\u5171\u6a21\u578b\u670d\u52a1\u5982 OpenAI\u3001Azure OpenAI\u3001Anthropic \u548c Gemini\u3002\u96c6\u6210\u7684\u6a21\u578b\u7c7b\u578b\u5e7f\u6cdb\uff0c\u6db5\u76d6\u6587\u672c\u751f\u6210\u3001\u5411\u91cf\u5206\u6790\u3001\u6392\u5e8f\u7b97\u6cd5\u3001\u8bed\u97f3\u8bc6\u522b\u3001\u8bed\u97f3\u5408\u6210\u3001\u8ba1\u7b97\u673a\u89c6\u89c9\u6a21\u578b\u4ee5\u53ca\u56fe\u50cf\u751f\u6210\u7b49\uff0c\u6ee1\u8db3\u591a\u6837\u5316\u7684\u4e1a\u52a1\u9700\u6c42\u548c\u5e94\u7528\u573a\u666f\u3002

    \u3010\u6a21\u578b\u3011\u7528\u6765\u7ba1\u7406\u5404\u7c7b\u5927\u578b\u6a21\u578b\uff0c\u4e3a\u540e\u7eed\u77e5\u8bc6\u5e93\u548c\u5e94\u7528\u63d0\u4f9b\u6a21\u578b\u4f7f\u7528\uff1b

    • \u5171\u4eab\u6a21\u578b\uff1a\u7cfb\u7edf\u7ba1\u7406\u5458\u5728\u3010\u5171\u4eab\u8d44\u6e90\u3011\u4e2d\u521b\u5efa\u5171\u4eab\u6a21\u578b\u540e\uff0c\u53ef\u4ee5\u6388\u6743\u7ed9\u6307\u5b9a\u5de5\u4f5c\u7a7a\u95f4\u3002
    • \u5168\u90e8\u6a21\u578b\uff1a\u7528\u6237\u53ef\u4ee5\u521b\u5efa\u6a21\u578b\uff0c\u5176\u4ed6\u7528\u6237\u8d44\u6e90\u6388\u6743\u540e\u53ef\u4ee5\u67e5\u770b\u3001\u4f7f\u7528\u548c\u7ef4\u62a4\u3002

    \u6ce8\u610f\uff1a\u5171\u4eab\u8d44\u6e90\u4e3a\u4f01\u4e1a\u7248 X-Pack \u529f\u80fd\u3002

    "},{"location":"user_manual/model/model_summary/#2","title":"2 \u6a21\u578b\u7ba1\u7406","text":"

    \u5de6\u4fa7\u9009\u62e9\u5168\u90e8\u6a21\u578b\u540e\uff0c\u9009\u62e9\u5bf9\u5e94\u4f9b\u5e94\u5546\uff0c\u3010\u6dfb\u52a0\u6a21\u578b\u3011\u8fdb\u884c\u6a21\u578b\u6dfb\u52a0\u3002

    \u652f\u6301\u7f16\u8f91\u3001\u6a21\u578b\u53c2\u6570\u8bbe\u7f6e\u548c\u5220\u9664\u3002

    \u652f\u6301\u6309\u6a21\u578b\u540d\u79f0\u3001\u6a21\u578b\u7c7b\u578b\u3001\u521b\u5efa\u8005\u67e5\u8be2\u3002

    \u6a21\u578b\u5220\u9664\u9700\u8981\u4e8c\u6b21\u786e\u8ba4\uff0c\u786e\u8ba4\u540e\u5c06\u76f4\u63a5\u5220\u9664\u6a21\u578b\u3002

    "},{"location":"user_manual/model/model_summary/#3","title":"3 \u652f\u6301\u7684\u4f9b\u5e94\u5546\u53ca\u6a21\u578b","text":"

    \u5404\u4f9b\u5e94\u5546\u652f\u6301\u7684\u7c7b\u578b\u8be6\u60c5\u89c1\u4e0b\u8868\uff08\u6309\u5b57\u6bcd\u6392\u5e8f\uff09\uff1a

    \u5927\u8bed\u8a00\u6a21\u578b \u5411\u91cf\u6a21\u578b \u91cd\u6392\u6a21\u578b \u8bed\u97f3\u8bc6\u522b \u8bed\u97f3\u5408\u6210 \u89c6\u89c9\u6a21\u578b \u56fe\u7247\u751f\u6210 \u6587\u751f\u89c6\u9891 \u56fe\u751f\u89c6\u9891 \u963f\u91cc\u4e91\u767e\u70bc \u2714 \u2714 \u2714 \u2714 \u2714 \u2714 \u2714 \u2714 \u2714 Anthropic \u2714 \u2714 Amazon Bedrock \u2714 \u2714 Azure OpenAI \u2714 \u2714 \u2714 \u2714 \u2714 \u2714 DeepSeek \u2714 Gemini \u2714 \u2714 \u2714 \u2714 kimi \u2714 OpenAI \u2714 \u2714 \u2714 \u2714 \u2714 \u2714 SILICONFLOW \u2714 \u2714 \u2714 \u2714 \u2714 \u2714 \u817e\u8baf\u4e91 \u2714 \u817e\u8baf\u6df7\u5143 \u2714 \u2714 \u2714 \u2714 \u2714 \u706b\u5c71\u5f15\u64ce \u2714 \u2714 \u2714 \u2714 \u2714 \u2714 \u2714 \u2714 \u5343\u5e06\u5927\u6a21\u578b \u2714 \u2714 \u8baf\u98de\u661f\u706b \u2714 \u2714 \u2714 \u2714 \u667a\u8c31 AI \u2714 \u2714 \u2714 \u672c\u5730\u6a21\u578b \u2714 \u2714 Ollama \u2714 \u2714 \u2714 \u2714 vLLM \u2714 \u2714 \u2714 \u2714 \u2714 Xorbits Inference \u2714 \u2714 \u2714 \u2714 \u2714 \u2714 \u2714"},{"location":"user_manual/model/ollama_model/","title":"\u5bf9\u63a5Ollama","text":""},{"location":"user_manual/model/ollama_model/#1","title":"1 \u6dfb\u52a0\u6a21\u578b","text":"

    \u8bf4\u660e\uff1a Ollama \u5141\u8bb8\u7528\u6237\u5728\u672c\u5730\u8ba1\u7b97\u673a\u4e0a\u8fd0\u884c\u548c\u90e8\u7f72\u5927\u578b\u8bed\u8a00\u6a21\u578b\u3002\u5728\u6dfb\u52a0 Ollama \u6a21\u578b\u4e4b\u524d\u9700\u8981\u5148\u81ea\u884c\u5b89\u88c5\u90e8\u7f72 Ollama \u5e76\u8fd0\u884c\u6a21\u578b\u3002

    \u53ef\u8be6\u53c2\u8003\uff1aOllama \u79bb\u7ebf\u90e8\u7f72LLM\u6a21\u578b\u3002

    \u6a21\u578b\u4f9b\u5e94\u5546\u4e3aOllama\uff0c\u5e76\u5728\u6a21\u578b\u6dfb\u52a0\u5bf9\u8bdd\u6846\u4e2d\u8f93\u5165\u5982\u4e0b\u5fc5\u8981\u4fe1\u606f\uff1a

    • \u6a21\u578b\u540d\u79f0\uff1aMaxKB \u4e2d\u81ea\u5b9a\u4e49\u7684\u6a21\u578b\u540d\u79f0\u3002
    • \u6a21\u578b\u7c7b\u578b\uff1a\u5927\u8bed\u8a00\u6a21\u578b/\u5411\u91cf\u6a21\u578b/\u89c6\u89c9\u6a21\u578b/\u91cd\u6392\u6a21\u578b\u3002
    • \u57fa\u7840\u6a21\u578b\uff1a\u4e0d\u540c\u7c7b\u578b\u6a21\u578b\u4e0b\u7684\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u4e0b\u62c9\u9009\u9879\u662f\u5e38\u7528\u7684\u4e00\u4e9b\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u652f\u6301\u81ea\u5b9a\u4e49\u8f93\u5165\uff0c\u4f46\u9700\u8981\u4e0e Ollama \u652f\u6301\u7684\u6a21\u578b\u540d\u79f0\u4fdd\u6301\u4e00\u81f4\uff0c\u5426\u5219\u65e0\u6cd5\u901a\u8fc7\u6821\u9a8c\u3002\u5982\u679c\u672c\u5730\u6ca1\u6709\u6b64\u6a21\u578b\uff0c\u7cfb\u7edf\u5c06\u81ea\u52a8\u4e0b\u8f7d\u3002

    \u5927\u8bed\u8a00\u6a21\u578b\u8fd8\u9700\u8981\u8f93\u5165 API \u57df\u540d\u548cAPI Key\uff0c\u5411\u91cf\u6a21\u578b\u9700\u8981\u8f93\u5165API \u57df\u540d\u3002

    • API \u57df\u540d\uff1a\u4e3a Ollama \u670d\u52a1\u5730\u5740\u8fde\u63a5\u4fe1\u606f\uff0c\u4f8b\u5982\uff1ahttp://42.92.198.53:11434 \u3002
    • API Key\uff1a\u82e5\u6ca1\u6709\u914d\u7f6eAPI Key\uff0c\u53ef\u4ee5\u8f93\u5165\u4efb\u610f\u5b57\u7b26\u3002

    \u70b9\u51fb\u3010\u6dfb\u52a0\u3011\uff0c\u6821\u9a8c\u901a\u8fc7\u5219\u6dfb\u52a0\u6210\u529f\uff0c\u4fbf\u53ef\u4ee5\u5728\u5e94\u7528\u7684 AI \u6a21\u578b\u5217\u8868\u9009\u62e9\u8be5\u6a21\u578b\u3002

    "},{"location":"user_manual/model/ollama_model/#2","title":"2 \u914d\u7f6e\u6837\u4f8b","text":"

    ollama-\u5927\u8bed\u8a00\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\uff1a

    ollama-\u5411\u91cf\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\uff1a

    ollama-\u89c6\u89c9\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\uff1a

    ollama-\u91cd\u6392\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\uff1a

    "},{"location":"user_manual/model/openai_model/","title":"\u5bf9\u63a5OpenAI","text":""},{"location":"user_manual/model/openai_model/#1","title":"1 \u6dfb\u52a0\u6a21\u578b","text":"

    \u9009\u62e9\u6a21\u578b\u4f9b\u5e94\u5546\u4e3aOpenAI\uff0c\u5e76\u5728\u6a21\u578b\u6dfb\u52a0\u5bf9\u8bdd\u6846\u4e2d\u8f93\u5165\u5982\u4e0b\u5fc5\u8981\u4fe1\u606f\uff1a

    • \u6a21\u578b\u540d\u79f0\uff1a MaxKB \u4e2d\u81ea\u5b9a\u4e49\u7684\u6a21\u578b\u540d\u79f0\u3002
    • \u6a21\u578b\u7c7b\u578b\uff1a \u5927\u8bed\u8a00\u6a21\u578b/\u5411\u91cf\u6a21\u578b/\u8bed\u97f3\u8bc6\u522b/\u8bed\u97f3\u5408\u6210/\u89c6\u89c9\u6a21\u578b/\u56fe\u7247\u751f\u6210\u3002
    • \u57fa\u7840\u6a21\u578b\uff1a \u4e0d\u540c\u7c7b\u578b\u6a21\u578b\u4e0b\u7684\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u4e0b\u62c9\u9009\u9879\u662f\u5e38\u7528\u7684\u4e00\u4e9b\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u652f\u6301\u81ea\u5b9a\u4e49\u8f93\u5165\uff0c\u4f46\u9700\u8981\u4e0e OpenAI \u652f\u6301\u7684\u6a21\u578b\u540d\u79f0\u4fdd\u6301\u4e00\u81f4\uff0c\u5426\u5219\u65e0\u6cd5\u901a\u8fc7\u6821\u9a8c\u3002
    • API \u57df\u540d\uff1a\u56fd\u5916 Open API \u7684\u57df\u540d\u662fhttps://api.openai.com/v1\uff0c\u56fd\u5185\u4ee3\u7406\u7684 API \u57df\u540d\u683c\u5f0f\u4e00\u822c\u662f\u53cd\u5411\u4ee3\u7406\u5730\u5740/v1\u3002
    • API Key\uff1a\u8bbf\u95ee OpenAI \u7684 Key\u3002

    "},{"location":"user_manual/model/openai_model/#2","title":"2 \u914d\u7f6e\u6837\u4f8b","text":"

    OpenAI-\u5927\u8bed\u8a00\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\uff1a

    OpenAI-\u5411\u91cf\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\uff1a

    OpenAI-\u8bed\u97f3\u8bc6\u522b\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\uff1a

    OpenAI-\u8bed\u97f3\u5408\u6210\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\uff1a

    OpenAI-\u89c6\u89c9\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\uff1a

    OpenAI-\u56fe\u7247\u751f\u6210\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\uff1a

    "},{"location":"user_manual/model/qianfan_model/","title":"\u5bf9\u63a5\u767e\u5ea6\u5343\u5e06","text":""},{"location":"user_manual/model/qianfan_model/#1","title":"1 \u6dfb\u52a0\u6a21\u578b","text":"

    \u6dfb\u52a0\u5343\u5e06\u5927\u6a21\u578b\u4e4b\u524d\uff0c\u9700\u8981\u5148\u5728 \u767e\u5ea6\u667a\u80fd\u4e91\u5343\u5e06\u5927\u6a21\u578b\u5e73\u53f0 \u4e2d\u8fdb\u884c\u6ce8\u518c\u5e76\u767b\u5f55\u3002\u5728\u63a7\u5236\u53f0\u4e2d\u7684\u3010\u5b89\u5168\u8ba4\u8bc1\u3011\u4e2d\u521b\u5efa API Key \u548c Secret Key \u7b49\u4fe1\u606f\u3002

    \u8bf4\u660e\uff1a \u5343\u5e06 ModelBuilder \u5df2\u7ecf\u63a8\u51fa\u517c\u5bb9 OpenAI \u89c4\u8303\u7684 v2 \u7248\u672c\u63a8\u7406\u63a5\u53e3\uff0cv1 \u7248\u672c\u63a8\u7406\u63a5\u53e3\u5373\u5c06\u4e0b\u7ebf\u3002MaxKB \u5bf9 v1\u548c v2 \u7248\u672c\u63a5\u53e3\u8fdb\u884c\u4e86\u517c\u5bb9\u5904\u7406\uff0c\u5728\u521b\u5efa\u6a21\u578b\u65f6\uff0c\u53ef\u4ee5\u6307\u5b9a API \u63a5\u53e3\u7248\u672c\u3002\u4f7f\u7528 v1 \u7248\u672c\u65f6\uff0c\u9700\u8981\u8f93\u5165 API Key \u548c Secret Key \u53c2\u6570\uff0c\u800c v2 \u7248\u672c\u7248\u672c\u8f93\u5165\u53c2\u6570\u4e3a API URL \u548c API Key\u3002

    \u9009\u62e9\u6a21\u578b\u4f9b\u5e94\u5546\u4e3a\u5343\u5e06\u5927\u6a21\u578b\uff0c\u5e76\u5728\u6a21\u578b\u6dfb\u52a0\u5bf9\u8bdd\u6846\u4e2d\u8f93\u5165\u5982\u4e0b\u5fc5\u8981\u4fe1\u606f\uff1a

    • \u6a21\u578b\u540d\u79f0\uff1aMaxKB \u4e2d\u81ea\u5b9a\u4e49\u7684\u6a21\u578b\u540d\u79f0\u3002
    • \u6a21\u578b\u7c7b\u578b\uff1a\u5927\u8bed\u8a00\u6a21\u578b/\u5411\u91cf\u6a21\u578b\u3002
    • \u57fa\u7840\u6a21\u578b\uff1a\u767e\u5ea6\u5343\u5e06\u652f\u6301\u7684 LLM \u6a21\u578b\u540d\u79f0\uff0c\u9009\u9879\u4e2d\u663e\u793a\u4e86\u767e\u5ea6\u5343\u5e06\u652f\u6301\u7684\u90e8\u5206\u5e38\u7528\u5927\u8bed\u8a00\u6a21\u578b\u540d\u79f0\uff0c\u652f\u6301\u624b\u52a8\u8f93\u5165\uff0c\u4f46\u9700\u8981\u4e0e\u5343\u5e06\u5927\u5e73\u53f0\u652f\u6301\u7684\u6a21\u578b\u540d\u79f0\u4fdd\u6301\u4e00\u81f4\uff0c\u5426\u5219\u65e0\u6cd5\u901a\u8fc7\u6821\u9a8c\u3002
    • API Version\uff1a API \u63a5\u53e3\u7248\u672c\uff0cv1/v2\u3002
    • API URL\uff1a API Version \u4e3a v2\u65f6\u7684\u8f93\u5165\u53c2\u6570\uff0c\u8bf7\u8f93\u5165https://qianfan.baidubce.com/v2\u3002
    • API Key \u548c Secret Key\uff1a API Version \u4e3a v1 \u65f6\u7684\u8f93\u5165\u53c2\u6570\uff0c \u5373\u5343\u5e06\u5927\u6a21\u578b\u4e2d\u5e94\u7528\u7684 API Key \u548c Secret Key\u3002

    "},{"location":"user_manual/model/qianfan_model/#2","title":"2 \u914d\u7f6e\u6837\u4f8b","text":"

    \u5343\u5e06\u5927\u6a21\u578b v2-\u5927\u8bed\u8a00\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\uff1a

    \u5343\u5e06\u5927\u6a21\u578b v2-\u5411\u91cf\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\uff1a

    "},{"location":"user_manual/model/siliconflow_model/","title":"\u5bf9\u63a5SILICONFLOW","text":""},{"location":"user_manual/model/siliconflow_model/#1","title":"1 \u6dfb\u52a0\u6a21\u578b","text":"

    \u6dfb\u52a0 SILICONFLOW \u6a21\u578b\u4e4b\u524d\uff0c\u9700\u8981\u5148\u5728 SILICONFLOW \u4e2d\u8fdb\u884c\u6ce8\u518c\u5e76\u767b\u5f55\u3002\u5728\u63a7\u5236\u53f0\u4e2d\u7684\u3010\u8d26\u6237\u7ba1\u7406-API\u5bc6\u94a5\u3011\u4e2d\u65b0\u5efa API \u5bc6\u94a5\u3002

    \u9009\u62e9\u6a21\u578b\u4f9b\u5e94\u5546\u4e3aSILICONFLOW\uff0c\u5e76\u5728\u6a21\u578b\u6dfb\u52a0\u5bf9\u8bdd\u6846\u4e2d\u8f93\u5165\u5982\u4e0b\u5fc5\u8981\u4fe1\u606f\uff1a

    • \u6a21\u578b\u540d\u79f0\uff1aMaxKB \u4e2d\u81ea\u5b9a\u4e49\u7684\u6a21\u578b\u540d\u79f0\u3002
    • \u6a21\u578b\u7c7b\u578b\uff1a\u5927\u8bed\u8a00\u6a21\u578b/\u5411\u91cf\u6a21\u578b/\u8bed\u97f3\u8bc6\u522b/\u8bed\u97f3\u5408\u6210/\u56fe\u7247\u751f\u6210/\u91cd\u6392\u6a21\u578b\u3002
    • \u57fa\u7840\u6a21\u578b\uff1aSILICONFLOW \u652f\u6301\u7684\u5404\u7c7b\u6a21\u578b\u7684\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u9009\u9879\u4e2d\u663e\u793a\u4e86 SILICONFLOW \u652f\u6301\u7684\u90e8\u5206\u5e38\u7528\u5927\u8bed\u8a00\u6a21\u578b\u540d\u79f0\uff0c\u652f\u6301\u624b\u52a8\u8f93\u5165\uff0c\u4f46\u9700\u8981\u4e0e SILICONFLOW \u652f\u6301\u7684\u6a21\u578b\u540d\u79f0\u4fdd\u6301\u4e00\u81f4\uff0c\u5426\u5219\u65e0\u6cd5\u901a\u8fc7\u6821\u9a8c\u3002
    • API URL\uff1ahttps://api.siliconflow.cn/v1
    • API Key\uff1a\u521b\u5efa\u7684\u5bc6\u94a5 Key\u3002

    "},{"location":"user_manual/model/siliconflow_model/#2","title":"2 \u914d\u7f6e\u6837\u4f8b","text":"

    SILICONFLOW-\u5927\u8bed\u8a00\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    SILICONFLOW-\u5411\u91cf\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    SILICONFLOW-\u8bed\u97f3\u8bc6\u522b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    SILICONFLOW-\u8bed\u97f3\u5408\u6210\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    SILICONFLOW-\u56fe\u7247\u751f\u6210\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    SILICONFLOW-\u91cd\u6392\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    "},{"location":"user_manual/model/spark_model/","title":"\u5bf9\u63a5\u8baf\u98de\u661f\u706b","text":""},{"location":"user_manual/model/spark_model/#1","title":"1 \u6dfb\u52a0\u6a21\u578b","text":"

    \u6dfb\u52a0\u8baf\u98de\u661f\u706b\u5927\u6a21\u578b\u4e4b\u524d\uff0c\u9700\u8981\u5148\u5728 \u8baf\u98de\u5f00\u653e\u5e73\u53f0 \u4e2d\u8fdb\u884c\u6ce8\u518c\uff0c\u5e76\u6839\u636e\u4e0d\u540c\u7684\u6a21\u578b\u7c7b\u578b\u521b\u5efa\u4e0d\u540c\u5e94\u7528\uff0c\u5e73\u53f0\u5c06\u81ea\u52a8\u751f\u6210APPID\u3001API Secret\u3001APIKey\u7b49\u4fe1\u606f\u3002

    \u9009\u62e9\u6a21\u578b\u4f9b\u5e94\u5546\u4e3a\u8baf\u98de\u661f\u706b\uff0c\u5e76\u5728\u6a21\u578b\u6dfb\u52a0\u5bf9\u8bdd\u6846\u4e2d\u8f93\u5165\u5982\u4e0b\u5fc5\u8981\u4fe1\u606f\uff1a

    • \u6a21\u578b\u540d\u79f0\uff1aMaxKB \u4e2d\u81ea\u5b9a\u4e49\u7684\u6a21\u578b\u540d\u79f0\u3002
    • \u6a21\u578b\u7c7b\u578b\uff1a\u5927\u8bed\u8a00\u6a21\u578b/\u5411\u91cf\u6a21\u578b/\u8bed\u97f3\u8bc6\u522b/\u8bed\u97f3\u5408\u6210\u3002
    • \u57fa\u7840\u6a21\u578b\uff1a\u5bf9\u5e94\u63a5\u53e3\u6587\u6863\u4e2d\u7684 domain\uff0c\u4e0b\u62c9\u9009\u9879\u662f\u8baf\u98de\u661f\u706b\u4e0d\u540c\u6a21\u578b\u7c7b\u578b\u4e0b\u7684\u5e38\u7528\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u652f\u6301\u81ea\u5b9a\u4e49\u8f93\u5165\u3002
    • API \u57df\u540d\uff1a\u6bcf\u4e2a\u57fa\u7840\u6a21\u578b\u5bf9\u5e94\u7684 API \u57df\u540d\u4e0d\u540c\uff0c\u8bf7\u6839\u636e\u6240\u9009\u57fa\u7840\u6a21\u578b\u8f93\u5165\u5bf9\u5e94\u7684 API \u57df\u540d\uff0c\u8be6\u60c5\u8bf7\u53c2\u8003\u8baf\u98de\u5f00\u653e\u5e73\u53f0\u6587\u6863\u4e2d\u5fc3\u3002
    • APP ID\uff1a\u8baf\u98de\u5f00\u653e\u5e73\u53f0\u4e2d\u521b\u5efa\u5e94\u7528\u7684\u6807\u8bc6\u3002
    • API Key\uff1a\u8baf\u98de\u5f00\u653e\u5e73\u53f0\u5e94\u7528\u8bbf\u95ee\u5bf9\u5e94\u7684 API Key\u3002
    • API Secret\uff1a\u8baf\u98de\u5f00\u653e\u5e73\u53f0\u5e94\u7528\u8bbf\u95ee\u5bf9\u5e94\u7684\u7684 API Secret\u3002

    "},{"location":"user_manual/model/spark_model/#2","title":"2 \u914d\u7f6e\u6837\u4f8b","text":"

    \u8baf\u98de\u661f\u706b-\u5927\u8bed\u8a00\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\uff1a

    \u8baf\u98de\u661f\u706b-\u5411\u91cf\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\uff1a

    \u8baf\u98de\u661f\u706b-\u8bed\u97f3\u8bc6\u522b\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\uff1a

    \u8baf\u98de\u661f\u706b-\u8bed\u97f3\u5408\u6210\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\uff1a

    "},{"location":"user_manual/model/tencentcloud_model/","title":"\u5bf9\u63a5\u817e\u8baf\u4e91","text":""},{"location":"user_manual/model/tencentcloud_model/#1","title":"1 \u6dfb\u52a0\u6a21\u578b","text":"

    \u6dfb\u52a0\u817e\u8baf\u77e5\u8bc6\u5f15\u64ce\u539f\u5b50\u80fd\u529b\u4e4b\u524d\uff0c\u9700\u8981\u5148\u5728\u817e\u8baf\u4e91\u5f00\u901a\u77e5\u8bc6\u5f15\u64ce\u539f\u5b50\u80fd\u529b\u670d\u52a1\u5e76\u65b0\u5efaAPI Key\u3002

    \u9009\u62e9\u6a21\u578b\u4f9b\u5e94\u5546\u4e3a\u817e\u8baf\u4e91\uff0c\u5e76\u5728\u6a21\u578b\u6dfb\u52a0\u5bf9\u8bdd\u6846\u4e2d\u8f93\u5165\u5982\u4e0b\u5fc5\u8981\u4fe1\u606f\uff1a

    • \u6a21\u578b\u540d\u79f0\uff1aMaxKB \u4e2d\u81ea\u5b9a\u4e49\u7684\u6a21\u578b\u540d\u79f0\u3002
    • \u6a21\u578b\u7c7b\u578b\uff1a\u5927\u8bed\u8a00\u6a21\u578b\u3002
    • \u57fa\u7840\u6a21\u578b\uff1a\u4e0d\u540c\u7c7b\u578b\u6a21\u578b\u4e0b\u7684\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u4e0b\u62c9\u9009\u9879\u662f\u5e38\u7528\u7684\u4e00\u4e9b\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u652f\u6301\u81ea\u5b9a\u4e49\u8f93\u5165\u3002
    • API URL\uff1ahttps://api.lkeap.cloud.tencent.com/v1/chat/completions\u3002
    • API Key\uff1a\u5728\u63a7\u5236\u53f0\u65b0\u5efa\u7684OpenAI API KEY\u3002

    "},{"location":"user_manual/model/tencentcloud_model/#2","title":"2 \u914d\u7f6e\u6837\u4f8b","text":"

    \u817e\u8baf\u4e91\u77e5\u8bc6\u5f15\u64ce\u539f\u5b50\u80fd\u529b-\u5927\u8bed\u8a00\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    "},{"location":"user_manual/model/tongyi_model/","title":"Tongyi model","text":""},{"location":"user_manual/model/tongyi_model/#1","title":"1 \u6dfb\u52a0\u6a21\u578b","text":"

    \u6dfb\u52a0\u901a\u4e49\u5343\u95ee\u6a21\u578b\u4e4b\u524d\uff0c\u9700\u8981\u5148\u5728\u963f\u91cc\u4e91 DashScope \u6a21\u578b\u670d\u52a1\u7075\u79ef\u7684\u63a7\u5236\u53f0\u4e2d\u521b\u5efa API-Key\u3002

    \u9009\u62e9\u6a21\u578b\u4f9b\u5e94\u5546\u4e3a\u901a\u4e49\u5343\u95ee\uff0c\u5e76\u5728\u6a21\u578b\u6dfb\u52a0\u5bf9\u8bdd\u6846\u4e2d\u8f93\u5165\u5982\u4e0b\u5fc5\u8981\u4fe1\u606f\uff1a

    • \u6a21\u578b\u540d\u79f0\uff1aMaxKB \u4e2d\u81ea\u5b9a\u4e49\u7684\u6a21\u578b\u540d\u79f0\u3002
    • \u6743\u9650\uff1a\u5206\u4e3a\u79c1\u6709\u548c\u516c\u7528\u4e24\u79cd\u6743\u9650\uff0c\u79c1\u6709\u6a21\u578b\u4ec5\u5f53\u524d\u7528\u6237\u53ef\u7528\uff0c\u516c\u7528\u6a21\u578b\u5373\u7cfb\u7edf\u5185\u6240\u6709\u7528\u6237\u5747\u53ef\u4f7f\u7528\uff0c\u4f46\u5176\u5b83\u7528\u6237\u4e0d\u80fd\u7f16\u8f91\u548c\u5220\u9664\u3002
    • \u6a21\u578b\u7c7b\u578b\uff1a\u5927\u8bed\u8a00\u6a21\u578b/\u89c6\u89c9\u6a21\u578b/\u56fe\u7247\u751f\u6210\u3002
    • \u57fa\u7840\u6a21\u578b\uff1a\u4e0d\u540c\u7c7b\u578b\u6a21\u578b\u4e0b\u652f\u6301\u7684\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u4e0b\u62c9\u9009\u9879\u662f\u5e38\u7528\u7684\u4e00\u4e9b\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u652f\u6301\u81ea\u5b9a\u4e49\u8f93\u5165\u3002
    • API Key\uff1a\u963f\u91cc\u4e91 DashScope\u7075\u79ef\u6a21\u578b\u670d\u52a1 API Key\u7ba1\u7406\u4e2d\u521b\u5efa\u548c\u67e5\u770b\u3002
    "},{"location":"user_manual/model/tongyi_model/#2","title":"2 \u914d\u7f6e\u6837\u4f8b","text":"

    \u901a\u4e49\u5343\u95ee-\u5927\u8bed\u8a00\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    \u901a\u4e49\u5343\u95ee-\u89c6\u89c9\u6a21\u578b\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    \u901a\u4e49\u5343\u95ee-\u56fe\u7247\u751f\u6210\u6a21\u578b\u9ed8\u8ba4\u56fe\u50cf\u5c3a\u5bf8\u4e3a 1024 * 1024\uff0c\u56fe\u7247\u6570\u91cf 1 \u5f20\uff0c\u98ce\u683c\u4e3a \uff0c\u5373\u7531\u6a21\u578b\u968f\u673a\u8f93\u51fa\u56fe\u50cf\u98ce\u683c\uff0c\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    "},{"location":"user_manual/model/vllm_model/","title":"\u5bf9\u63a5vLLM","text":""},{"location":"user_manual/model/vllm_model/#1","title":"1 \u6dfb\u52a0\u6a21\u578b","text":"

    \u9009\u62e9\u6a21\u578b\u4f9b\u5e94\u5546\u4e3avLLM\uff0c\u5e76\u5728\u6a21\u578b\u6dfb\u52a0\u5bf9\u8bdd\u6846\u4e2d\u8f93\u5165\u5982\u4e0b\u5fc5\u8981\u4fe1\u606f\uff1a

    • \u6a21\u578b\u540d\u79f0\uff1aMaxKB \u4e2d\u81ea\u5b9a\u4e49\u7684\u6a21\u578b\u540d\u79f0\u3002
    • \u6a21\u578b\u7c7b\u578b\uff1a\u5927\u8bed\u8a00\u6a21\u578b/\u5411\u91cf\u6a21\u578b/\u8bed\u97f3\u8bc6\u522b\u6a21\u578b/\u89c6\u89c9\u6a21\u578b/\u91cd\u6392\u6a21\u578b\u3002
    • \u57fa\u7840\u6a21\u578b\uff1a\u4e0d\u540c\u7c7b\u578b\u6a21\u578b\u4e0b\u7684\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u4e0b\u62c9\u9009\u9879\u662f\u5e38\u7528\u7684\u4e00\u4e9b\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u652f\u6301\u81ea\u5b9a\u4e49\u8f93\u5165\u3002
    • API \u57df\u540d\uff1avLLM \u670d\u52a1\u5730\u5740\uff0c \u5982\uff1ahttp://192.168.20.242:8000/v1 \u3002
    • API Key\uff1a\u82e5\u6ca1\u6709 API Key\uff0c\u8f93\u5165\u4efb\u610f\u5b57\u7b26\u5373\u53ef\u3002
    "},{"location":"user_manual/model/vllm_model/#2","title":"2 \u914d\u7f6e\u6837\u4f8b","text":"

    vLLM-\u5927\u8bed\u8a00\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    vLLM-\u5411\u91cf\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    vLLM-\u8bed\u97f3\u8bc6\u522b\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    vLLM-\u89c6\u89c9\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    vLLM-\u91cd\u6392\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    "},{"location":"user_manual/model/zhipu_model/","title":"\u5bf9\u63a5\u667a\u8c31AI","text":""},{"location":"user_manual/model/zhipu_model/#1","title":"1 \u6dfb\u52a0\u6a21\u578b","text":"

    \u6dfb\u52a0\u8baf\u667a\u8c31AI\u6a21\u578b\u4e4b\u524d\uff0c\u9700\u8981\u5148\u5728 \u667a\u8c31AI\u5f00\u653e\u5e73\u53f0 \u4e2d\u8fdb\u884c\u6ce8\u518c\u5e76\u521b\u5efa API Key\u3002

    \u9009\u62e9\u6a21\u578b\u4f9b\u5e94\u5546\u4e3a\u667a\u8c31AI\uff0c\u5e76\u5728\u6a21\u578b\u6dfb\u52a0\u5bf9\u8bdd\u6846\u4e2d\u8f93\u5165\u5982\u4e0b\u5fc5\u8981\u4fe1\u606f\uff1a

    • \u6a21\u578b\u540d\u79f0\uff1aMaxKB \u4e2d\u81ea\u5b9a\u4e49\u7684\u6a21\u578b\u540d\u79f0\u3002
    • \u6a21\u578b\u7c7b\u578b\uff1a\u5927\u8bed\u8a00\u6a21\u578b/\u89c6\u89c9\u6a21\u578b/\u56fe\u7247\u751f\u6210\u3002
    • \u57fa\u7840\u6a21\u578b\uff1a\u4e0d\u540c\u7c7b\u578b\u6a21\u578b\u4e0b\u7684\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u4e0b\u62c9\u9009\u9879\u662f\u5e38\u7528\u7684\u4e00\u4e9b\u57fa\u7840\u6a21\u578b\u540d\u79f0\uff0c\u652f\u6301\u81ea\u5b9a\u4e49\u8f93\u5165\u3002
    • API Key\uff1a\u5728\u667a\u8c31 AI \u5f00\u653e\u5e73\u53f0\u521b\u5efa\u7684 API Key\u3002

    "},{"location":"user_manual/model/zhipu_model/#2","title":"2 \u914d\u7f6e\u6837\u4f8b","text":"

    \u667a\u8c31AI-\u5927\u8bed\u8a00\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    \u667a\u8c31AI-\u89c6\u89c9\u6a21\u578b\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    \u667a\u8c31AI-\u56fe\u7247\u751f\u6210\u6a21\u578b\u914d\u7f6e\u6837\u4f8b\u56fe\u793a\u5982\u4e0b\uff1a

    "},{"location":"user_manual/team/team/","title":"\u56e2\u961f\u7ba1\u7406","text":"

    \u5728 MaxKB \u4e2d\uff0c\u652f\u6301\u56e2\u961f\u534f\u540c\u7ef4\u62a4\u77e5\u8bc6\u5e93\u548c\u5e94\u7528\u3002\u5185\u7f6e\u6240\u6709\u8005\u548c\u6210\u5458\u4e24\u79cd\u89d2\u8272\uff0c\u77e5\u8bc6\u5e93/\u5e94\u7528\u521b\u5efa\u8005\u5373\u4e3a\u6240\u6709\u8005\u89d2\u8272\uff0c\u6dfb\u52a0\u7684\u6210\u5458\u7528\u6237\u90fd\u662f\u6210\u5458\u89d2\u8272\u3002\u6240\u6709\u8005\u53ef\u4ee5\u6dfb\u52a0\u548c\u79fb\u9664\u6210\u5458\u3002 \u53cb\u60c5\u63d0\u793a\uff1a\u793e\u533a\u7248\u9650\u5236 1 \u4e2a\u56e2\u961f\u6210\u5458\u3002

    "},{"location":"user_manual/team/team/#1","title":"1 \u6dfb\u52a0\u6210\u5458","text":"

    \u70b9\u51fb\u3010\u6dfb\u52a0\u6210\u5458\u3011\uff0c\u9700\u8981\u8f93\u5165\u5b8c\u6574\u7684\u6210\u5458\u7528\u6237\u540d\u6216\u90ae\u7bb1\u540e\u8fdb\u884c\u6dfb\u52a0\u3002 \u6ce8\u610f\uff1a \u5f85\u6dfb\u52a0\u7684\u6210\u5458\u5fc5\u987b\u662f\u5df2\u5b58\u5728\u7684\u7528\u6237\u3002

    "},{"location":"user_manual/team/team/#2","title":"2 \u6743\u9650\u8bbe\u7f6e","text":"

    \u6dfb\u52a0\u6210\u5458\u540e\uff0c\u53ef\u4ee5\u5bf9\u6210\u5458\u5206\u914d\u77e5\u8bc6\u5e93\u548c\u5e94\u7528\u7684\u7684\u6743\u9650\u3002

    • \u7ba1\u7406\u6743\u9650\uff0c\u5f53\u6210\u5458\u767b\u5f55 MaxKB \u540e\u53ef\u4ee5\u7ba1\u7406\u64cd\u4f5c\u76f8\u5e94\u8d44\u6e90\u3002
    • \u4f7f\u7528\u6743\u9650\uff0c\u5f53\u6210\u5458\u767b\u5f55 MaxKB \u540e\u4ec5\u80fd\u67e5\u770b\u76f8\u5e94\u8d44\u6e90\u3002

    \u70b9\u51fb\u3010\u4fdd\u5b58\u3011\u540e\uff0c\u6743\u9650\u8bbe\u7f6e\u751f\u6548\u3002

    "},{"location":"user_manual/team/team/#3","title":"3 \u79fb\u9664\u6210\u5458","text":"

    \u5728\u6210\u5458\u5217\u8868\u4e2d\u70b9\u51fb\u3010\u2026\u3011->\u3010\u79fb\u9664\u3011\u5373\u53ef\u5220\u9664\u8be5\u6210\u5458\uff0c\u6210\u5458\u79fb\u9664\u540e\u5c06\u5931\u53bb\u6240\u6709\u6743\u9650\u3002

    "},{"location":"user_manual/tool/tool/","title":"\u5de5\u5177","text":""},{"location":"user_manual/tool/tool/#1","title":"1 \u529f\u80fd\u6982\u8ff0","text":"

    MaxKB \u652f\u6301\u7528\u6237\u6839\u636e\u81ea\u8eab\u7684\u4e1a\u52a1\u9700\u6c42\uff0c\u901a\u8fc7\u5404\u79cd\u5de5\u5177\u83b7\u53d6\u548c\u67e5\u8be2\u6570\u636e\u3001\u903b\u8f91\u5224\u65ad\u3001\u4fe1\u606f\u63d0\u53d6\u6216\u5176\u5b83\u573a\u666f\u7684\u64cd\u4f5c\u5e76\u5728\u5e94\u7528\u7f16\u6392\u65f6\u8fdb\u884c\u8c03\u7528\uff0c\u4ee5\u6ee1\u8db3\u5404\u79cd\u590d\u6742\u7684\u4e1a\u52a1\u9700\u6c42\u3002

    • \u5171\u4eab\u5de5\u5177\uff1a\u7cfb\u7edf\u7ba1\u7406\u5458\u5728\u3010\u5171\u4eab\u8d44\u6e90\u3011\u4e2d\u521b\u5efa\u5171\u4eab\u5de5\u5177\u540e\uff0c\u53ef\u4ee5\u6388\u6743\u7ed9\u6307\u5b9a\u5de5\u4f5c\u7a7a\u95f4\u3002
    • \u5168\u90e8\u5de5\u5177\uff1a\u7528\u6237\u53ef\u4ee5\u521b\u5efa\u5de5\u5177\uff0c\u5176\u4ed6\u7528\u6237\u8d44\u6e90\u6388\u6743\u540e\u53ef\u4ee5\u67e5\u770b\u3001\u4f7f\u7528\u548c\u7ef4\u62a4\u3002

    \u5de5\u5177\u901a\u8fc7\u6587\u4ef6\u5939\u8fdb\u884c\u7ba1\u7406\uff0c\u6839\u76ee\u5f55\u4e0b\u53ef\u5efa\u7acb\u6700\u591a\u4e09\u7ea7\u7684\u5b50\u6587\u4ef6\u5939\u3002\u6bcf\u4e00\u7ea7\u6587\u4ef6\u5939\u5185\u5747\u53ef\u521b\u5efa\u76f8\u5e94\u7684\u5de5\u5177\u3002\u7528\u6237\u53ef\u4ee5\u521b\u5efa\u5de5\u5177\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u8d44\u6e90\u6388\u6743\u540e\u7684\u5de5\u5177\u3002

    \u6ce8\u610f\uff1a\u5171\u4eab\u8d44\u6e90\u4e3a\u4f01\u4e1a\u7248 X-Pack \u529f\u80fd\u3002

    "},{"location":"user_manual/tool/tool/#2","title":"2 \u81ea\u5b9a\u4e49\u5de5\u5177","text":""},{"location":"user_manual/tool/tool/#21","title":"2.1 \u4f9d\u8d56\u5b89\u88c5","text":"

    \u5982\u679c\u5de5\u5177\u5b9e\u73b0\u9700\u8981\u5b89\u88c5\u7b2c\u4e09\u65b9\u4f9d\u8d56\u5305\uff0c\u53ef\u5728 MaxKB \u5bb9\u5668\u4e2d\u4f7f\u7528 pip \u547d\u4ee4\u8fdb\u884c\u5b89\u88c5\u3002

    # \u8fdb\u5165 MaxKB \u5bb9\u5668\u4e2d\ndocker exec -it maxkb bash\n\n# pip\u5b89\u88c5\u7b2c\u4e09\u65b9\u4f9d\u8d56\uff0c\u5982 pymysql\uff0c\u6267\u884c\u4e0b\u9762\u547d\u4ee4\npip install pymysql \n
    "},{"location":"user_manual/tool/tool/#22","title":"2.2 \u5de5\u5177\u521b\u5efa","text":"

    \u70b9\u51fb\u3010\u521b\u5efa\u5de5\u5177\u3011\uff0c\u6253\u5f00\u521b\u5efa\u5de5\u5177\u9875\u9762\u3002

    • \u5de5\u5177\u540d\u79f0\uff1a\u5de5\u5177\u7684 logo \u4e0e\u5de5\u5177\u540d\u79f0\uff0c\u4fbf\u4e8e\u8bc6\u522b\u3002\u5de5\u5177 logo \u5728\u4fdd\u5b58\u540e\u53ef\u81ea\u5b9a\u4e49\u4e0a\u4f20\u3002
    • \u63cf\u8ff0\uff1a\u5de5\u5177\u8be6\u7ec6\u8bf4\u660e\u4ee5\u53ca\u4f7f\u7528\u6ce8\u610f\u4e8b\u9879\uff0c\u4f1a\u663e\u793a\u5728\u9ad8\u7ea7\u7f16\u6392\u5e94\u7528\u7684\u7ec4\u4ef6\u5217\u8868\u4e2d\u3002
    • \u542f\u52a8\u53c2\u6570\uff1a\u542f\u7528\u53c2\u6570\u5373\u5de5\u5177\u8fd0\u884c\u7684\u5fc5\u8981\u53c2\u6570\uff0c\u4f8b\u5982 API Key \u7b49\u3002\u5c06\u542f\u52a8\u53c2\u6570\u4e0e\u8f93\u5165\u53c2\u6570\u5206\u79bb\uff0c\u5728\u5de5\u4f5c\u6d41\u4e2d\u4ec5\u5173\u6ce8\u8f93\u5165\u53c2\u6570\uff0c\u540c\u65f6\u4e5f\u907f\u514d\u5173\u952e\u4fe1\u606f\u7684\u6cc4\u9732\u3002
    • \u8f93\u5165\u53c2\u6570\uff1a\u5de5\u5177\u7684\u8f93\u5165\u53c2\u6570\uff0c\u53c2\u6570\u7684\u6570\u636e\u7c7b\u522b\u5305\u62ec\uff1astring\u3001int\u3001float\u3001array\uff0c\u53ef\u81ea\u5b9a\u4e49\u8d4b\u503c\uff0c\u4e5f\u53ef\u5f15\u7528\u53c2\u6570\u3002
    • \u51fd\u6570\u5185\u5bb9\uff1a\u81ea\u5b9a\u4e49\u7f16\u5199 Python \u5de5\u5177\u4ee3\u7801\uff0c\u53ef\u4ee5\u5f15\u7528\u8f93\u5165\u53d8\u91cf\u3002
    • \u8f93\u51fa\u53c2\u6570\uff1aPython \u4ee3\u7801\u6267\u884c\u8fd4\u56de\u7684\u7ed3\u679c\u3002

    Python \u4ee3\u7801\u7f16\u5199\u5b8c\u6210\u540e\uff0c\u70b9\u51fb\u3010\u8c03\u8bd5\u3011\u8fdb\u884c\u4ee3\u7801\u529f\u80fd\u7684\u9a8c\u8bc1\u3002\u8c03\u8bd5\u5b8c\u6210\u540e\uff0c\u70b9\u51fb\u3010\u521b\u5efa\u3011\uff0c\u5373\u5b8c\u6210\u5de5\u5177\u7684\u521b\u5efa\u3002\u5df2\u521b\u5efa\u6210\u529f\u7684\u5de5\u5177\uff0c\u9ed8\u8ba4\u72b6\u6001\u4e3a\u3010\u5df2\u7981\u7528\u3011\u3002

    \u5df2\u542f\u7528\u7684\u5de5\u5177\uff0c\u53ef\u4ee5\u5728\u3010\u9ad8\u7ea7\u7f16\u6392\u5e94\u7528\u3011\u7684\u4e2d\uff0c\u70b9\u51fb\u3010\u6dfb\u52a0\u7ec4\u4ef6\u3011->\u3010\u5de5\u5177\u3011\u4e2d\uff0c\u4ee5\u6dfb\u52a0\u7ec4\u4ef6\u7684\u65b9\u5f0f\u8c03\u7528\u5de5\u5177\uff1b\u4e5f\u53ef\u901a\u8fc7\u3010AI \u5bf9\u8bdd\u3011\u7ec4\u4ef6\u7684\u3010\u5de5\u5177\u3011\u8fdb\u884c\u8c03\u7528\u3002

    "},{"location":"user_manual/tool/tool/#3-mcp","title":"3 \u521b\u5efa MCP","text":"

    \u70b9\u51fb\u3010\u521b\u5efa MCP\u3011\uff0c\u6253\u5f00\u521b\u5efa MCP \u9875\u9762\u3002

    • MCP \u540d\u79f0\uff1aMCP \u7684\u540d\u79f0\u4e0e Logo\uff0c\u4fbf\u4e8e\u8bc6\u522b\u3002MCP \u7684 Logo \u5728\u4fdd\u5b58\u540e\u53ef\u81ea\u5b9a\u4e49\u4e0a\u4f20\u3002
    • \u63cf\u8ff0\uff1a MCP \u8be6\u7ec6\u8bf4\u660e\u4ee5\u53ca\u4f7f\u7528\u6ce8\u610f\u4e8b\u9879\u3002
    • MCP Server Config\uff1a\u4f7f\u7528 JSON \u683c\u5f0f\u586b\u5199 MCP Server \u914d\u7f6e\u53c2\u6570\u3002\u901a\u8fc7 SSE/Streamable HTTP \u534f\u8bae\u8c03\u7528 MCP \u670d\u52a1\u4e2d\u7684\u5de5\u5177\u3002

    \u5df2\u521b\u5efa\u6210\u529f\u7684 MCP\uff0c\u9ed8\u8ba4\u72b6\u6001\u4e3a\u3010\u5df2\u7981\u7528\u3011\u3002\u5f00\u542f MCP \u540e\uff0c\u53ef\u4ee5\u5728\u3010\u9ad8\u7ea7\u7f16\u6392\u5e94\u7528\u3011->\u3010AI \u5bf9\u8bdd\u3011\u7684 MCP \u4e2d\u8fdb\u884c\u5f15\u7528\u3002

    "},{"location":"user_manual/tool/tool/#4","title":"4 \u5de5\u5177\u5546\u5e97","text":"

    \u5de5\u5177\u5546\u5e97\u662f MaxKB \u7cfb\u7edf\u4e2d\u7684\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u5e2e\u52a9\u7528\u6237\u6269\u5c55\u7cfb\u7edf\u7684\u529f\u80fd\u3002

    \u5de5\u5177\u5546\u5e97\u4e2d\u7684\u5de5\u5177\u4e3b\u8981\u5206\u4e3a\u7cfb\u7edf\u5185\u7f6e\u5de5\u5177\u548c\u5de5\u5177\u5546\u5e97\u4e24\u90e8\u5206\uff1a

    \u7cfb\u7edf\u5185\u7f6e\uff1a

    • \u8054\u7f51\u641c\u7d22\uff1a\u63d0\u4f9b Web \u641c\u7d22\u529f\u80fd\uff0c\u5982 Google Search\u3001\u535a\u67e5\u641c\u7d22\u3001LangSearch \u7b49\uff0c\u5e2e\u52a9\u7528\u6237\u5feb\u901f\u4ece\u4e92\u8054\u7f51\u83b7\u53d6\u4fe1\u606f\u3002
    • \u6570\u636e\u5e93\u67e5\u8be2\uff1a\u652f\u6301\u8fde\u63a5\u4e0d\u540c\u7c7b\u578b\u7684\u6570\u636e\u5e93\u5e76\u6267\u884c\u67e5\u8be2\uff0c\u5982 MySQL \u67e5\u8be2\u3001PostgreSQL \u67e5\u8be2\u7b49\uff0c\u65b9\u4fbf\u7528\u6237\u7ba1\u7406\u548c\u5206\u6790\u6570\u636e\u3002

    \u5de5\u5177\u5546\u5e97\uff1a\u7528\u6237\u53ef\u76f4\u63a5\u5728\u5546\u5e97\u4e2d\u9009\u62e9\u6240\u9700\u7684\u5de5\u5177\uff0c\u65e0\u9700\u624b\u52a8\u5f00\u53d1\u6216\u8fdb\u884c\u590d\u6742\u96c6\u6210\uff0c\u53ef\u4ee5\u663e\u8457\u63d0\u5347\u5de5\u5177\u7684\u8c03\u7528\u6548\u7387\u3002

    \u4e3a\u4e86\u4e30\u5bcc\u5de5\u5177\u5546\u5e97\u8d44\u6e90\uff0c\u63a8\u52a8\u4ea7\u54c1\u751f\u6001\u6301\u7eed\u53d1\u5c55\uff0cMaxKB \u8bda\u631a\u9080\u8bf7\u5e7f\u5927\u793e\u533a\u7528\u6237\u53c2\u4e0e\u5de5\u5177\u8d21\u732e\uff0c\u5171\u4eab\u6280\u672f\u6210\u679c\uff1a

    • \u8d21\u732e\u8def\u5f84\uff1a\u5f00\u53d1\u8005\u53ef\u4ee5\u6309\u7167\u5b98\u65b9\u63d0\u4f9b\u7684\u5de5\u5177\u5f00\u53d1\u89c4\u8303\u5f00\u53d1\u9002\u7528\u4e8e MaxKB \u7684\u5de5\u5177\uff08\u4f8b\u5982API\u5bf9\u63a5\u7c7b\u3001\u672c\u5730\u529f\u80fd\u7c7b\u5177\u7b49\uff09\uff1b
    • \u63d0\u4ea4\u65b9\u5f0f\uff1a\u5b8c\u6210\u5f00\u53d1\u540e\uff0c\u5c06\u5de5\u5177\u4ee3\u7801\u63d0\u4ea4\u81f3 GitHub \u5b98\u65b9\u5de5\u5177\u4ed3\u5e93\uff0c\u9879\u76ee\u56e2\u961f\u5c06\u6309\u6d41\u7a0b\u5ba1\u6838\uff0c\u901a\u8fc7\u540e\u5373\u53ef\u4e0a\u67b6\u81f3 MaxKB \u5de5\u5177\u5546\u5e97\uff0c\u4f9b\u5168\u4f53\u793e\u533a\u7528\u6237\u4f7f\u7528\uff1b
    • \u5171\u5efa\u5f00\u53d1\u751f\u6001\uff1a\u793e\u533a\u8d21\u732e\u7684\u5de5\u5177\u4e0d\u4ec5\u80fd\u5e2e\u52a9\u66f4\u591a\u7528\u6237\u89e3\u51b3\u5b9e\u9645\u95ee\u9898\uff0c\u4e5f\u5c06\u4fc3\u8fdb MaxKB \u5de5\u5177\u751f\u6001\u7684\u591a\u6837\u5316\u53d1\u5c55\uff0c\u5f62\u6210\u201c\u7528\u6237\u9700\u6c42-\u5de5\u5177\u5f00\u53d1-\u751f\u6001\u5b8c\u5584\u201d \u7684\u6b63\u5411\u5faa\u73af\u3002

    \u5185\u7f6e\u5de5\u5177\u6dfb\u52a0\u540e\uff0c\u5728\u914d\u7f6e\u542f\u52a8\u53c2\u6570\uff08\u4f8b\u5982\u6570\u636e\u5e93\u8fde\u63a5\u4fe1\u606f\u3001API Key \u7b49\uff09\u5e76\u542f\u7528\u540e\uff0c\u4fbf\u53ef\u5728\u9ad8\u7ea7\u7f16\u6392\u5e94\u7528\u4e2d\u8c03\u7528\u3002

    "},{"location":"user_manual/tool/tool/#5","title":"5 \u5de5\u5177\u5bfc\u51fa/\u5bfc\u5165","text":"

    \u5de5\u5177\u652f\u6301\u5bfc\u51fa\u548c\u5bfc\u5165\uff0c\u5bfc\u51fa\u7684\u6587\u4ef6\u540e\u7f00\u4e3a .tool\u3002

    \u70b9\u51fb\u3010\u5bfc\u5165\u521b\u5efa\u3011\uff0c\u9009\u62e9\u540e\u7f00\u540d\u4e3a .tool \u7684\u6587\u4ef6\u5e76\u6253\u5f00\u3002

    \u5de5\u5177\u5c06\u81ea\u52a8\u5bfc\u5165\uff0c\u5bfc\u5165\u7684\u5de5\u5177\u9ed8\u8ba4\u72b6\u6001\u4e3a\u3010\u5df2\u7981\u7528\u3011\uff0c\u53ef\u4ee5\u70b9\u51fb\u5de5\u5177\uff0c\u8fdb\u5165\u7f16\u8f91\u5de5\u5177\u67e5\u770b\u548c\u4fee\u6539\u5de5\u5177\u3002

    "},{"location":"user_manual/tool/tool/#6","title":"6 \u590d\u5236\u5de5\u5177","text":"

    \u70b9\u51fb\u5de5\u5177\u9762\u677f\u7684\u3010\u590d\u5236\u3011\u6309\u94ae\uff0c\u6253\u5f00\u590d\u5236\u5de5\u5177\u5bf9\u8bdd\u6846\uff0c\u5bf9\u539f\u5de5\u5177\u5185\u5bb9\u8fdb\u884c\u7f16\u8f91\u4fee\u6539\u540e\u70b9\u51fb\u3010\u521b\u5efa\u3011\u5373\u53ef\u5feb\u901f\u521b\u5efa\u4e00\u4e2a\u65b0\u5de5\u5177\u3002

    "},{"location":"user_manual/tool/tool/#7","title":"7 \u5220\u9664\u5de5\u5177","text":"

    \u70b9\u51fb\u5de5\u5177\u9762\u677f\u7684\u3010\u5220\u9664\u3011\u6309\u94ae\uff0c\u5373\u53ef\u5bf9\u5de5\u5177\u8fdb\u884c\u5220\u9664\u3002

    \u6ce8\u610f\uff1a \u5de5\u5177\u5220\u9664\u540e\uff0c\u4e0d\u53ef\u6062\u590d\u3002 \u5982\u679c\u5e94\u7528\u5f15\u7528\u4e86\u8be5\u5de5\u5177\uff0c\u5728\u7f16\u6392\u9875\u9762\u5c06\u663e\u793a\u3010\u8be5\u5de5\u5177\u4e0d\u53ef\u7528\u3011\u7684\u63d0\u793a\u4fe1\u606f\u3002

    "}]} \ No newline at end of file diff --git a/v2/sitemap.xml b/v2/sitemap.xml new file mode 100644 index 00000000..8d2de246 --- /dev/null +++ b/v2/sitemap.xml @@ -0,0 +1,331 @@ + + + + https://maxkb.cn/docs/v2/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/changelog/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/contact/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/instructional_video/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/quick_start/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/system_arch/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/dev_manual/APIKey_chat/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/dev_manual/dev_environment/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/faq/GPU_runOllama/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/faq/MaxKB%20VS.Dify/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/faq/Offline_install_OllamaModel/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/faq/apply_setting/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/faq/doc_segment/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/faq/function_library/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/faq/install_configuration/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/faq/knowledge_base/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/faq/maxkb_In_halo/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/faq/system_management/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/installation/1panel_installtion/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/installation/aliyun/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/installation/backup/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/installation/cli/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/installation/migrate/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/installation/offline_installtion/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/installation/online_installtion/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/installation/tencent/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/chat_to_API/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/email/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/user_community/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/X-Pack/app_auth/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/X-Pack/app_chatueser/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/X-Pack/app_integrate/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/X-Pack/app_logo_settting/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/X-Pack/authorization_resources/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/X-Pack/chat_authentication/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/X-Pack/chat_user/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/X-Pack/feishu_doc/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/X-Pack/login_auth/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/X-Pack/operation_log/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/X-Pack/resource_management/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/X-Pack/role/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/X-Pack/shared_resources/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/X-Pack/system_API/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/X-Pack/theme_settings/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/X-Pack/user/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/X-Pack/workspace/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/app/app-view/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/app/app/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/app/hit-testing/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/app/log/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/app/serialization/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/app/simple_app/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/app/workflow_app/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/dataset/dataset/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/dataset/doclist/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/dataset/hit-testing/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/dataset/problem/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/model/Regolo_model/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/model/X-Infer_model/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/model/amazon_bedrock_model/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/model/anthropic_model/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/model/azure_openai_model/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/model/bailian_model/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/model/deepseek_model/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/model/doubao_model/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/model/gemini_model/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/model/hunyuan_model/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/model/kimi_model/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/model/local_model/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/model/model_param/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/model/model_summary/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/model/ollama_model/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/model/openai_model/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/model/qianfan_model/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/model/siliconflow_model/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/model/spark_model/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/model/tencentcloud_model/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/model/tongyi_model/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/model/vllm_model/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/model/zhipu_model/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/team/team/ + 2025-10-18 + + + https://maxkb.cn/docs/v2/user_manual/tool/tool/ + 2025-10-18 + + \ No newline at end of file diff --git a/v2/sitemap.xml.gz b/v2/sitemap.xml.gz new file mode 100644 index 00000000..94298c64 Binary files /dev/null and b/v2/sitemap.xml.gz differ diff --git a/v2/system_arch/index.html b/v2/system_arch/index.html new file mode 100644 index 00000000..d3a8f331 --- /dev/null +++ b/v2/system_arch/index.html @@ -0,0 +1,2945 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 系统架构 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    系统架构

    +

    1 整体架构

    +

    架构图

    +

    2 技术栈

    +
    + +
    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/X-Pack/app_auth/index.html b/v2/user_manual/X-Pack/app_auth/index.html new file mode 100644 index 00000000..f1c9d3fb --- /dev/null +++ b/v2/user_manual/X-Pack/app_auth/index.html @@ -0,0 +1,2884 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 身份验证 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    访问限制

    +
    +

    支持通过身份验证的方式对应用进行访问限制,进一步保障信息安全 可设置【密码验证】或【登录认证】。

    +

    选择【登录认证】后,需至少启用一种登录方式。

    +
      +
    • 【对话用户】需管理员在【系统管理 】中对【对话用户】以及【用户组】里增删改用户组及用户。
    • +
    • 【登录方式】需管理员在【系统管理】中配置 【登录认证】,以及在【对话用户】中开启单点登录和扫码登录后才会显示。
    • +
    • 【账号登录验证码设置】应用管理者可以设置对话用户登录失败指定次数后启用验证码校验的功能,当用户连续登录失败次数达到预设阈值时,系统会自动触发验证码校验机制,有效防范暴力破解等安全风险。
    • +
    +
    +

    登录认证

    +
    +

    应用身份验证开启后,通过公开访问链接时(包括浮窗框)需要输入验证密码才可以进入问答页面。

    +说明: 身份验证开启后,通过公开访问链接访问应用时都需要输入验证密码,包括演示以及全屏/浮窗模式嵌入,而应用接入到企业微信、公众号、钉钉、飞书则不受影响。

    +
    +

    身份验证

    +

    身份验证

    +
    +

    如选择扫码登录方式(如钉钉、飞书或企业微信),当用户访问小助手进行对话时,系统将自动弹出所选平台的扫码界面。用户完成扫码后即可快速登录并开始对话

    +
    +

    登录认证

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/X-Pack/app_chatueser/index.html b/v2/user_manual/X-Pack/app_chatueser/index.html new file mode 100644 index 00000000..6f41361e --- /dev/null +++ b/v2/user_manual/X-Pack/app_chatueser/index.html @@ -0,0 +1,2881 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 对话用户 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    对话用户

    +
    +

    支持设置允许进入当前应用问答页面进行提问的用户组及用户。

    +
    +
    +

    若对话用户属于多个用户组,任一用户组被授权即可进入应用提问。 用户被移出用户组后,对应授权将被取消。
    +自动授权规则:

    +
      +
    • 开启:当前用户组及后续新增成员自动授权,可进入应用提问。
    • +
    • 关闭:需手动为用户组成员授权,新增成员默认未授权。
    • +
    +

    注意

    +
      +
    • 在应用中仅支持查看和授权用户组,用户组和成员管理需要空间管理员或系统管理员在【系统管理】中进行。
    • +
    • 未在【身份验证】中启用登录认证,应用关联的全部知识库可被任意用户检索。
    • +
    +
    +

    对话用户

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/X-Pack/app_integrate/index.html b/v2/user_manual/X-Pack/app_integrate/index.html new file mode 100644 index 00000000..bc364d3f --- /dev/null +++ b/v2/user_manual/X-Pack/app_integrate/index.html @@ -0,0 +1,3219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 应用接入 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + +

    应用接入

    +
    +

    支持创建的应用的与企业微信智能机器人、企业微信应用、企业微信客服、公众号(服务号和订阅号)、钉钉应用、飞书应用接入,实现企业内部员工、外部公众进行对话。

    +
    +

    1 企业微信智能机器人

    +
    +

    企业微信机器人支持在 企业微信内部群聊 中@智能机器人进行问答对话。

    +
    +

    对话演示

    +
    +

    在应用接入中点击【企业微信智能机器人】的配置按钮,配置信息中会自动生成回调 URL,并需要复制到企业微信智能机器人的 API 接收设置中的 URL 中。

    +
    +

    企微机器人配置

    +
    +

    创建机器人:在企业微信管理后台,点击 【安全与管理】-【管理工具】-【智能机器人】-【创建机器人】。

    +
    +

    创建企微机器人 +创建企微机器人

    +
    +

    选择【API 模式创建】。

    +
    +

    API模式创建

    +
    +

    填写基本信息后,在 URL 中,写入 MaxKB 应用配置中的回调地址,同时,将随机生成的 Token 和 Encoding-AESKey 填写在 MaxKB 应用配置中,并保存应用配置。保存后,回到企业微信管理后台创建机器人。

    +

    注意: 在企业微信应用API接收消息配置保存之前,一定要在 MaxKB 中完成企业微信应用配置并保存,不然保存时将报错openapi回调地址请求不通过

    +
    +

    回调地址

    +
    +

    创建完成后,即可在 企业微信内部群聊 中@智能机器人,进行提问。

    +
    +

    对话演示

    +

    2 企业微信应用

    +
    +

    企业微信应用对接后,可在【企业微信】-【工作台】的应用中找到对应的应用并进行对话

    +
    +

    企业微信对话

    +
    +

    在应用接入中点击【企业微信应用】的【配置】按钮,配置信息中会自动生成回调 URL,并需要复制到企业微信应用的 API 接收设置中,除此之外的其它信息,将在企业微信管理后台中生成并获取。

    +
    +

    显示设置

    +
    +

    获取企业ID: 在企业微信管理后台,点击 【我的企业】菜单,在最下方可以看到企业ID 信息。

    +
    +

    企业ID

    +
    +

    创建企业微信应用:在【应用管理】中点击【创建应用】,选择应用logo,设置应用名称和应用介绍以及可见范围。

    +
    +

    企业微信应用设置

    +
    +

    获取 Agentid 和 Secret:进入创建的应用,获取 AgentId 和 Secret。点击【查看】Secret 将通过企业微信进行查看。

    +
    +

    企微应用信息

    +
    +

    获取 Token 和 EncodingAESKey:进入企业微信应用设置的【接收消息】-【设置 API 接收】,随机获取 Token 和 EncodingAESKey。

    +

    在 MaxKB 企业微信应用配置输入对应的参数并保存,回到企业微信应用设置【接收消息】-【设置API接收】企业微信应用接入配置中自动生成的回调 URL,最后点击【保存】。

    +

    注意: 在企业微信应用API接收消息配置保存之前,一定要在 MaxKB 中完成企业微信应用配置并保存,不然保存时将报错openapi回调地址请求不通过

    +
    +

    设置API接收

    +
    +

    注意: 在企业微信应用API接收消息配置保存之前,一定要在 MaxKB 中完成企业微信应用配置并保存,不然保存时将报错openapi回调地址请求不通过

    +
    +

    设置API接收

    +
    +

    配置企业可信 IP:进入企业微信应用设置的【企业可信 IP】中,把 MaxKB 服务的 IP 地址设置为可信 IP。

    +
    +

    配置可信IP

    +
    +

    以上步骤配置完成后,并在企业微信应用接入配置中输入企业微信应用信息后保存,便可在企业微信应用中找到机器人进行对话。

    +
    +

    企业微信对话

    +

    3 企业微信客服

    +
    +

    企业微信客服对接后,可以在群聊中@微信客服,通过跳转连接,实现客服一对一问答。

    +
    +

    企业微信客服账号

    +
    +

    MaxKB 应用接入企业微信应用后,在此基础上,还可以将此应用接入到微信客服,对外部用户提供服务。
    +创建客服账号:在企业微信管理后台的【应用管理】中,点击【微信客服】,并创建账号,客服账号的接待方式选择:机器人+人工接待

    +
    +

    企业微信客服账号

    +

    企业微信客服账号

    +
    +

    客服账号与应用关联:在微信客服中配置【可调用接口的应用】,并配置客服账号。

    +
    +

    企业微信客服账号

    +

    企业微信客服账号

    +
    +

    开启客服助理:在企业的外部群设置中开启【客服助理】,微信客服便会加入群中,群里的任何用户仅需要@客服助理,即可发起咨询,并微信客服进行一对一的对话。

    +
    +

    企业微信客服账号 +企业微信客服账号

    +

    4 微信公众号

    +
    +

    对接后,可直接通过微信公众号实现问答对话。

    +
    +

    公众号对话

    +
    +

    在应用接入中点击【公众号】的【配置】按钮,配置信息中会自动生成回调 URL,并需要复制到【微信公众平台-设置与开发-基本配置-服务器配置】服务器地址 URL 中,除此之外的其它信息,将在微信公众平台中生成并获取。

    +
    +

    公众号配置

    +
    +

    获取 APP ID、APP Secret、Token 和消息加解密密钥:在微信公众平台-设置与开发-基本配置中获取 APP ID、APP Secret 信息,并启动服务器配置,生成 Token 和消息加解密密钥。

    +
    +

    公众号信息 +公众号信息

    +
    +

    将生成的 APP ID、APP Secret、Token 和消息加解密密钥信息输入到 MaxKB 公众号配置窗口中,并保存。

    +
    +

    公众号信息

    +
    +

    将【公众号-基本配置-服务器配置】中的 URL 设置为 MaxKB 公众号配置窗口中的回调地址 URL,然后提交,并启用服务器配置。

    +
    +

    公众号信息

    +
    +

    开启客服接口权限。

    +
    +

    客服接口权限

    +
    +

    设置 IP 白名单:进入公众号基本配置的【IP 白名单】中,添加 MaxKB 服务器的 IP 地址。

    +
    +

    公众号IP白名单

    +
    +

    根据以上步骤完成配置后,即可在公众号中发送消息进行对话。

    +
    +

    公众号对话

    +

    5 钉钉应用

    +
    +

    接入钉钉后,可在群聊中@机器人,进行问答对话。

    +
    +

    钉钉机器人对话

    +
    +

    在应用接入中点击【钉钉应用】的【配置】按钮,配置信息中会自动生成回调 URL,并需要复制到钉钉-机器人设置-消息接收地址中,其它信息,将在钉钉开放平台中生成并获取。

    +
    +

    钉钉机器人创建

    +
    +

    创建机器人:在 钉钉开放平台的【应用开发】-【钉钉应用】中,点击【创建应用】,填写应用信息后,点击【保存】。

    +
    +

    钉钉机器人创建

    +
    +

    获取 Client ID 和 Client Secret:进入创建好的钉钉应用,打开【凭证与基础信息】页面,获取 Client ID 和 Client Secret。

    +
    +

    钉钉应用信息

    +
    +

    在 MaxKB 钉钉应用配置窗口中输入步骤获取的 Client ID 和 Client Secret 应用凭证,并保存。

    +
    +

    钉钉应用信息

    +
    +

    点击【添加应用能力】,选择 【机器人】能力,点击 【添加】,输入机器人基本配置信息后,将【消息接收模式】设置为 HTTP 模式,并将 MaxKB 钉钉应用配置中的回调地址的URL填写到消息接收地址中,然后点击【发布】。

    +
    +

    钉钉机器人添加 +钉钉机器人息接收模式

    +
    +

    根据以上步骤完成配置后,就可以群里@机器人中进行对话,或与机器人应用一对一对话。

    +
    +

    钉钉对话

    +

    6 飞书应用

    +
    +

    接入飞书后,可在应用中找到对应应用,进行问答对话。

    +
    +

    飞书对话

    +
    +

    在应用接入中点击【飞书应用】的【配置】按钮,配置信息中会自动生成回调 URL,并需要复制到【飞书开放平台-事件与回调-事件配置-配置订阅方式】的请求地址中,除此之外的其它信息,将在飞书开放平台中生成并获取。

    +
    +

    飞书应用配置

    +
    +

    创建飞书机器人:首先在 飞书开发平台的【企业自建应用】中,点击【创建企业自建应用】,填写应用信息。

    +
    +

    飞书添加机器人

    +
    +

    点击【添加应用能力】,选择 【按能力添加-机器人】,点击【添加】

    +
    +

    飞书添加机器人

    +
    +

    添加权限:打开【权限管理】,复制下面的权限配置并粘贴到【API 权限-权限配置】输入框,全选筛选出来的权限项,点击【批量开通】,最后点击【确认】。

    +
     m:message,im:message.group_at_msg:readonly,im:message.p2p_msg:readonly,im:message:send_as_bot,im:resource, contact:contact.base:readonly,contact:user.base:readonly
    +
    +
    +

    飞书权限

    +
    +

    获取 APP ID、APP Secret 和 Verification Token:进入创建好的飞书应用,打开【凭证与基础信息】页面,获取 APP ID 和 APP Secret。

    +
    +

    飞书应用信息i

    +
    +

    打开【事件与回调-加密策略】,获取 Verification Token。

    +
    +

    飞书token

    +
    +

    在 MaxKB 飞书应用配置窗口输入上述信息,并保存。

    +
    +

    飞书事件与回调

    +
    +

    配置回调URL:在飞书开放平台中打开【事件与回调】-【回调配置】的订阅方式中,将MaxKB中飞书应用的回调地址的URL填写到【请求地址】中。

    +
    +

    飞书事件与回调

    +

    飞书事件与回调

    +
    +

    发布应用:点击【创建版本】,填写版本信息后,点击【保存】。

    +
    +

    飞书应用发布

    +

    飞书应用发布

    +
    +

    确认发布后,应用状态将更新为已启用

    +
    +

    飞书应用发布

    +
    +

    根据以上步骤完成配置后,即可打开飞书客户端搜索MaxKB小助手,点击【添加】后进行一对一对话。

    +
    +

    飞书对话 飞书对话

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/X-Pack/app_logo_settting/index.html b/v2/user_manual/X-Pack/app_logo_settting/index.html new file mode 100644 index 00000000..606dcbeb --- /dev/null +++ b/v2/user_manual/X-Pack/app_logo_settting/index.html @@ -0,0 +1,2872 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 显示设置 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    应用显示设置

    +
    +

    除了支持语言、显示知识的来源、显示执行详情,X-Pack 还支持更丰富的配置,包括应用对话框主题颜色、字体颜色、AI 回复头像显示和替换、提问用户头像的显示和替换、浮窗入库入口图标以及位置、历史记录、引导图以及免责声明等。

    +
    +

    显示设置

    +
    +

    应用显示配置效果示例图:

    +
    +

    对话框

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/X-Pack/authorization_resources/index.html b/v2/user_manual/X-Pack/authorization_resources/index.html new file mode 100644 index 00000000..9d8b68fe --- /dev/null +++ b/v2/user_manual/X-Pack/authorization_resources/index.html @@ -0,0 +1,2992 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 资源授权 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    资源授权

    +
    +

    资源授权功能用于管理用户对工作空间内资源的访问权限。

    +
      +
    • 系统管理员可以在【系统管理】中对所有资源进行授权;
    • +
    • 工作空间管理员可以在工作空间中,对工作空间内的所有资源进行授权;
    • +
    • 普通用户可以对自己创建的资源进行授权;
    • +
    +
    +

    1 系统资源授权

    +
    +

    系统管理员(所有工作空间)和工作空间管理员(仅可以选择作为工作空间管理员角色的工作空间)可进行资源授权操作:

    +
      +
    • 成员:列出所选工作空间下的含有普通用户及继承普通用户角色的成员。
    • +
    • 资源:应用、知识库、工具、模型按工作空间的文件夹管理目录列出所选工作空间下的资源。
    • +
    • 操作:
        +
      • 不授权:默认对资源不进行授权。
      • +
      • 查看:仅能查看和使用资源,不能对该资源进行增删改操作。
      • +
      • 管理:可以对该资源进行所有操作。
      • +
      • 按用户角色:对所选的资源,按照角色拥有的权限赋予用户权限。
      • +
      +
    • +
    +

    注意:工作空间以及资源权限为企业版 X-Pack 功能:

    +
    +

    资源

    +

    2 用户资源授权

    +
    +

    用户可以在应用、知识库、工具和模型中,将资源授权给指定的用户,授权的用户为当前工作空间下的所有成员。

    +
    +

    资源授权

    +

    3 资源授权规则

    +
    +
      +
    • 默认对系统管理员的授权是按用户角色,修改工作空间管理员和系统管理员不影响二者对资源的角色权限(优先级高);
    • +
    • 当普通用户被授予【管理】权限时,也可对应用进行资源授权操作,但需遵守角色权限最高规则;
    • +
    • 如果成员有多个角色,取所有角色的最大权限(并集)进行授权。
    • +
    +
    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/X-Pack/chat_authentication/index.html b/v2/user_manual/X-Pack/chat_authentication/index.html new file mode 100644 index 00000000..a823da06 --- /dev/null +++ b/v2/user_manual/X-Pack/chat_authentication/index.html @@ -0,0 +1,2859 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 登录认证 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    登录认证

    +
    +

    支持通过身份验证的方式对应用进行访问限制,进一步保障信息安全 可设置【密码验证】或【登录认证】。

    +

    选择【登录认证】后,需至少启用一种登录方式。

    +
      +
    • 【对话用户】需管理员在【系统管理 】中对【对话用户】以及【用户组】里增删改用户组及用户。
    • +
    • 【登录方式】需管理员在【系统管理】中配置 【登录认证】,以及在【对话用户】中开启单点登录和扫码登录后才会显示。
    • +
    +
    +

    身份验证设置

    +
    +

    应用身份验证开启后,通过公开访问链接时(包括浮窗框)需要输入验证密码才可以进入问答页面。

    +说明: 身份验证开启后,通过公开访问链接访问应用时都需要输入验证密码,包括演示以及全屏/浮窗模式嵌入,而应用接入到企业微信、公众号、钉钉、飞书则不受影响。

    +
    +

    身份验证

    +身份验证

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/X-Pack/chat_user/index.html b/v2/user_manual/X-Pack/chat_user/index.html new file mode 100644 index 00000000..55508c20 --- /dev/null +++ b/v2/user_manual/X-Pack/chat_user/index.html @@ -0,0 +1,3140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 对话用户 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    对话用户

    +
    +

    对话用户是经过身份验证后,能够在问答页面进行提问的用户。管理员可以通过用户组管理功能,在【应用】和【知识库】灵活控制哪些用户可以访问问答页面和使用知识库,并为不同用户组分配不同的权限。
    +权限说明:

    +
      +
    • 系统管理员:可管理对话用户、用户组、登录认证。
    • +
    • 工作空间管理员:可管理对话用户和用户组。
    • +
    +
    +

    1 用户管理

    +

    1.1 创建用户

    +
    +

    管理员可以创建和删除对话用户。用户信息包括:

    +
      +
    • 用户名:4-20个字符,必填且唯一。
    • +
    • 姓名:1-20个字符,必填且唯一。
    • +
    • 状态:正常/禁用。禁用后,用户无法访问系统的任何功能。
    • +
    • 邮箱、手机号:非必填。
    • +
    • 密码:必填,规则同系统用户。第三方用户的默认密码为Profile配置中的密码(例如:MaxKB@123)。
    • +
    • 用户组:一个用户可以属于多个用户组,也可以不选择任何用户组。
    • +
    • 用户来源:本地创建。
    • +
    • 创建时间:自动记录用户的创建时间。
    • +
    +
    +

    创建对话用户

    +
    +

    除用户名外,其他属性均可编辑修改。

    +
    +

    编辑对话用户

    +
    +

    管理员可以修改对话用户账号的登录密码,密码规则与系统用户一致。

    +
    +

    修改密码对话用户

    +

    1.2 设置用户组

    +
    +

    设置用户组。支持多个对话用户批量设置用户组。

    +
      +
    • 勾选需要设置的对话用户。
    • +
    • 点击【设置用户组】按钮,弹出设置对话框。
    • +
    • 选择设置方式:
        +
      • 追加:为所选用户追加新的用户组。
      • +
      • 替换:删除所选用户原有的用户组,设置新的用户组。
      • +
      +
    • +
    +
    +

    设置用户组

    +

    1.3 同步用户

    +
    +

    仅系统管理员可以执行此操作,工作空间管理员无此功能。同步时:

    +
      +
    • 用户来源:支持同步系统用户。
    • +
    • 同步字段:用户名、姓名、邮箱、手机号、状态、密码、用户类型。
    • +
    • 用户组:同步的用户将被分配到默认用户组。
    • +
    • 用户类型:与系统用户保持一致。
    • +
    • 同步逻辑:已存在的用户将被跳过,不会重复添加或更新。
    • +
    +
    +

    同步对话用户

    +

    2 用户组管理

    +
    +

    用户组是对话用户管理,用于将用户分类并集中管理。通过用户组,管理员可以为不同类型的用户分配不同的权限。
    +系统管理员和工作空间管理员可以进行以下操作:

    +
      +
    • 添加用户组:创建新的用户组。
    • +
    • 删除/重命名用户组:统内置一个默认用户组,该用户组不可删除,但可以重命名。
    • +
    • 添加/移除成员:为用户组添加或移除成员,支持批量操作。
    • +
    +
    +

    删除用户组

    +
    +

    用户组名称是唯一,最大 128 个字符。

    +
    +

    创建用户组

    +
    +

    删除用户组时,系统会提示确认操作,并提醒管理员该用户组下的所有成员将被移除。

    +
    +

    删除用户组

    +
    +

    支持给用户组添加成员。

    +
    +

    添加对话用户

    +

    3 登录认证

    +
    +

    系统支持灵活配置对话用户的登录认证方式,包括集成主流第三方平台的扫码登录功能,适用于构建安全、高效、统一的对话用户管理体系。

    +
    +

    登录认证

    +
    +

    登录认证配置完成后,可以在【应用】- 【概览】 - 【访问限制】中显示该登录方式。

    +
    +

    登录认证

    +
    +

    如选择扫码登录方式(如钉钉、飞书或企业微信),当用户访问小助手进行对话时,系统将自动弹出所选平台的扫码界面。用户完成扫码后即可快速登录并开始对话

    +
    +

    登录认证

    +

    4 使用场景

    +
    +

    系统管理员设置完用户对话用户,用户在创建应用和知识库时,可以设置对话用户组来控制使用相关权限。

    +
    +

    登录认证

    +

    登录认证

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/X-Pack/feishu_doc/index.html b/v2/user_manual/X-Pack/feishu_doc/index.html new file mode 100644 index 00000000..26626248 --- /dev/null +++ b/v2/user_manual/X-Pack/feishu_doc/index.html @@ -0,0 +1,3097 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 飞书文档 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + +

    飞书文档知识库

    +

    1 飞书机器人配置

    +
    +

    支持通过飞书文档构建知识库,目前支持飞书的云文档和表格文档。
    +注意:对飞书文档的支持是通过飞书机器人并配置对应的文档权限实现,并在群组中通过将机器人设置为协作者。

    +
    +

    1.1 创建飞书机器人

    +
    +

    首先在 飞书开发平台的【企业自建应用】中,点击【创建企业自建应用】,填写应用信息。

    +
    +

    飞书创建

    +
    +

    点击【添加应用能力】,选择 【按能力添加-机器人】,点击【添加】

    +
    +

    飞书添加机器人

    +

    1.2 添加权限

    +
    +

    打开【权限管理】,复制下面的权限配置并粘贴到【API权限-权限配置】输入框,全选筛选出来的权限项,点击【批量开通】,最后点击【确认】。

    +
    docs:document:export,docx:document:readonly,drive:drive,space:document:retrieve
    +
    +
    +

    飞书文档权限

    +

    1.3 获取必要信息

    +
    +

    获取APP ID、APP Secret和 Folder Token。 +进入创建好的飞书应用,打开【凭证与基础信息】页面,获取APP ID和APP Secret。

    +
    +

    飞书应用信息i

    +

    1.4 应用发布

    +
    +

    点击【创建版本】,填写版本信息后,点击【保存】,待管理员审核后进行群组设置。

    +
    +

    飞书应用发布

    +

    1.5 群组设置

    +
    +

    在内部群组中添加对应的群机器人。

    +
    +

    飞书群机器人

    +
    +

    在飞书文档的文件夹中,添加包含应用机器人的群组作为协作者。

    +
    +

    飞书群机器人

    +

    2 创建飞书文档知识库

    +
    +

    在创建知识库时,知识库类型选择为【飞书】,并配置相应参数:

    +
      +
    • App ID:飞书应用唯一标识。
    • +
    • App Secret:飞书应用凭证。
    • +
    • Folder Token:是飞书云空间中每个文件夹的唯一标识,用于区分和操作特定的文件夹飞书中的文件夹。选中文件夹,在链接信息中即可获取。
    • +
    +
    +

    飞书文件夹 +飞书知识库创建

    +
    +

    在飞书知识库中,点击【导入文档】,选择飞书文件夹下面需要上传的文档,点击开始导入,即可以将飞书文档导入到 MaxKB 中。

    +
    +

    飞书文档筛选 +飞书文档筛选

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/X-Pack/login_auth/index.html b/v2/user_manual/X-Pack/login_auth/index.html new file mode 100644 index 00000000..ee3bd199 --- /dev/null +++ b/v2/user_manual/X-Pack/login_auth/index.html @@ -0,0 +1,3453 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 登录认证 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + +

    登录认证

    +

    登录设置

    +
    +

    MaxKB 支持对默认登录方式和账号登录验证码进行设置。

    +

    默认登录方式:管理员可以根据企业统一的登录策略,预先设置系统默认的登录途径,例如账号密码登录或第三方登录。

    +

    账号登录验证码设置:当用户连续登录失败次数达到预设阈值时,系统会自动触发验证码校验机制,有效防范暴力破解等安全风险。

    +
    +

    登录设置 +登录设置

    +

    登录认证

    +
    +

    支持 LDAP、CAS、OIDC、OAUTH2 单点认证协议,以及企业微信、钉钉、飞书移动端扫码登录和免密,满足企业对于强身份验证和访问控制的需求。

    +
    +

    扫码登录

    +

    1 LDAP

    +
    +

    配置 LDAP 的过程可参考下图,注意勾选下方"启用 LDAP 认证"后开启此功能。
    +提示:配置完成可点击上方【测试连接】即时测试配置信息是否正确,网络是否连通。

    +
    +

    LDAP

    +

    2 CAS

    +
    +

    配置 CAS 的过程可参考下图,注意勾选下方"启用 CAS 认证"后开启此功能。
    +说明: CAS 回调地址即 MaxKB 访问地址加上 /api/cas ,例如:http://40.100.86.240:8080/admin/api/cas

    +
    +

    CAS

    +

    3 OIDC

    +
    +

    配置 OIDC 的过程可参考下图,注意勾选下方"启用 OIDC 认证"后开启此功能。
    +说明: OIDC 回调地址即 MaxKB 访问地址加上 /api/oidc ,例如:http://40.100.86.240:8080/admin/api/oidc

    +
    +

    OIDC

    +

    4 OAUTH2

    +
    +

    配置 OAUTH2 的过程可参考下图(授权端以 github 为例),注意勾选下方"启用 OAHTU2 认证"后开启此功能。
    +说明: OAUTH2 回调地址即 MaxKB 访问地址加上 /api/oauth2 ,例如:http://40.100.86.240:8080/admin/api/oauth2

    +
    +

    OAHTU2

    +

    5 平台对接

    +
    +

    支持企业微信、钉钉、飞书接入,支持扫码登录、免密登录。

    +
    +

    扫码登录

    +

    5.1 企业微信对接

    +
    5.1.1 企业微信对接设置
    +
    +

    MaxKB 对接企业微信,需要填写以下信息:

    +
      +
    • Corp ID:企业ID。企业微信管理员在管理后台的【企业信息】中获取。
    • +
    • Agent ID:企业微信自建应用唯一标识,企业微信管理在管理后台创建或查看应用时获取。
    • +
    • App Secret:企业微信自建应用的密钥。
    • +
    • 回调地址:即 MaxKB 访问的 URL。
    • +
    +
    +
    +

    MaxKB 配置企业微信扫码登录时,需要企业微信管理员登录 企业微信管理管理 并创建企业自建应用,完成配置后发布应用。

    +
    +

    企微应用创建

    +

    企微应用创建

    +
    +

    第一步:创建应用。在【应用管理-应用-自建】中点击【创建应用】,输入应用名称等信息,应用创建完成后即可查看应用 Agent ID和 Secret。

    +
    +

    企微应用创建

    +

    企微应用信息

    +
    +

    第二步:设置可信域名。在【开发者接口】中点击【设置可信域名】,添加可信域名,并进行校验。可参考可信域名配置

    +
    +

    设置可信域名

    +
    +

    第三步:授权回调域。在【企业微信授权】中设置授权回调域。

    +
    +

    设置回调域

    +
    +

    第三步:配置企业可信IP。在【企业可信IP】中配置可信ip。

    +
    +

    配置可信IP

    +
    +

    完成企业微信应用的配置和发布后,在 MaxKB 企业微信登录扫码配置页面配置相应信息并通过效验。

    +
    +

    企业微信配置

    +
    +

    后续即可在 MaxKB 登陆页面点击选择企业微信进行扫码登陆。

    +
    +
    5.1.2 企业微信免登设置
    +
    +

    应用主页地址的构造可以参考企业微信开发指南造网页授权链接——构造企业oauth2链接
    +链接格式即参数说明如下:

    + +

    主页地址示例:https://open.weixin.qq.com/connect/oauth2/authorize?redirect_uri=https%3A%2F%2Fmaxkbk.fit2cloud.cn/admin/api/wecom/oauth2&response_type=code&scope=snsapi_privateinfo&appid=ww5fad05aaa36d118c&agentid=1000002&state=maxkb#wechat_redirect

    +
    +

    企业微信配置

    +
    +

    配置完成后,在企业微信工作台中找到 MaxKB 应用,免登访问 MaxKB。

    +
    +

    企业微信配置

    +

    5.2 钉钉对接

    +
    5.2.1 钉钉对接设置
    +
    +

    MaxKB 对接钉钉,需要填写以下信息:

    +
      +
    • Corp ID:钉钉组织标识,在钉钉开放平台中右上方组织信息中查看。
    • +
    • APP Key:钉钉应用标识,在钉钉开放平台中查看应用【凭证与基础信息】中查看。
    • +
    • App Secret:钉钉应用秘钥,在钉钉开放平台中查看应用【凭证与基础信息】中查看。
    • +
    • 回调地址:即 MaxKB 访问URL。
    • +
    +
    +
    +

    MaxKB 配置钉钉扫码登录时,需要在 钉钉开放平台 创建应用并进行配置。

    +

    第一步:创建应用。在【应用开发-钉钉应用】中点击【创建应用】,应用创建完后在【凭证与基础信息】可查案 APPKey 和 APPSecret 信息。

    +
    +

    钉钉创建应用 +钉钉应用信息

    +
    +

    第二步:进入到【权限管理】中,添加如下图所示的权限即可。

    +
    +

    钉钉应用信息

    +
    +

    第三步:在【版本管理与发布】中,填写应用版本号、版本描述等信息,点击【保持】,发布应用。

    +
    +

    钉钉应用信息

    +
    +

    完成配置后发布,然后在 MaxKB 钉钉扫码登录扫码配置页面进行配置并保存。

    +
    +

    钉钉创建应用

    +
    +

    后续即可在 MaxKB 登陆页面点击选择钉钉进行扫码登陆。

    +
    +
    5.2.2 钉钉免登设置
    +
    +

    添加网页应用能力。在钉钉开放平台的【应用能力】中,添加【网页应用】。

    +
    +

    钉钉创建应用

    +
    +

    设置【应用首页】和【PC 端首页地址】。

    +

    地址格式为:http(s)://xxx.xxx.xxx/admin/login?client=dingtalk=CORPID。注意 corpId=CORPID 需替换成真正的 CORPID。

    +
    +

    钉钉应用配置

    +
    +

    安全设置。在【安全设置】中设置重定向 URL 和端内免登录地址。

    +
    +

    钉钉安全配置

    +
    +

    分享设置,在【接入登录】中设置【回调域名】。

    +
    +

    钉钉安全配置

    +
    +

    应用发布后,即可在钉钉工作台免登录访问 MaxKB。

    +
    +

    钉钉安全配置

    +

    5.3 飞书对接

    +
    5.3.1 飞书对接设置
    +
    +

    MaxKB 对接飞书,需要填写以下信息:

    +
      +
    • APP Key;
    • +
    • Corp ID;
    • +
    • App Secret:MaxKB 提供的回调地址,并作为飞书免登录授权的跳转地址;
    • +
    • 回调地址:即 MaxKB URL 地址 + '/api/feishu',例如:http://xx.xxx.xx.xxx/api/feishu
    • +
    +
    +
    +

    MaxKB 配置飞书扫码登录时,需要在 飞书开放平台 创建企业自建应用,完成配置后发布,然后在 MaxKB 飞书扫码登录扫码配置页面进行配置并保存。

    +
    +
    +

    第一步:创建企业自建应用。点击【创建企业自建应用】,输入应用名称、描述以及上传应用图标后,点击【创建】。

    +
    +

    飞书创建

    +
    +

    第二步:配置重定向 URL。在【开发配置-安全设置】中,输 入MaxKB 飞书扫码配置弹出框中的回调地址,点击【添加】。

    +
    +

    飞书配置回调URL

    +
    +

    第三步:发布应用。在【版本管理与发布】中,输入应用版本号、更新说明等信息,点击【保存】,完成应用发布。

    +
    +

    飞书发布应用

    +

    飞书配置

    +
    +

    发布应用后,即可在 MaxKB 登陆页面点击选择飞书进行扫码登陆。

    +
    +
    5.3.2 飞书免登设置
    +
    +

    添加【页面应用】能力。

    +
    +

    飞书添加页面应用

    +
    +

    配置桌面主页,例如:配置中填写 桌面端主页地址,如:http(s)://xxx.xxx.xxx/admin/login?client=lark&appId=cli_a7e1c1ddexxxxx。

    +
    +

    飞书页面应用配置

    +
    +

    在【安全设置】中添加重定向 URL。

    +
    +

    飞书安全配置

    +
    +

    应用发布后,即可在飞书工作台免登录访问 MaxKB。

    +
    +

    飞书安全配置

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/X-Pack/operation_log/index.html b/v2/user_manual/X-Pack/operation_log/index.html new file mode 100644 index 00000000..8c277440 --- /dev/null +++ b/v2/user_manual/X-Pack/operation_log/index.html @@ -0,0 +1,2874 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 操作日志 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    系统日志

    +
    +

    MaxKB 系统管理员在【系统设置-操作日志】中可查看所有用户对知识库、模型、应用等操作,方便审计和回溯。

    +
      +
    • +

      支持筛选不同时间段或者自定义时间范围的操作日志。

      +
    • +
    • +

      支持按用户、状态、IP 地址等方式进行搜索。

      +
    • +
    +
    +

    operation_log

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/X-Pack/resource_management/index.html b/v2/user_manual/X-Pack/resource_management/index.html new file mode 100644 index 00000000..c8a44021 --- /dev/null +++ b/v2/user_manual/X-Pack/resource_management/index.html @@ -0,0 +1,2962 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 资源管理 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    资源管理

    +
    +

    资源管理功能为系统管理员提供统一、高效的资源可视化管理能力。系统管理员可以集中查看、管理和维护所有工作空间下的核心资源,包括 应用、知识库、工具、模型等。

    +
    +

    1 资源查看

    +
    +

    支持查看各种工作空间对知识库、应用、模型、工具资源:

    +
      +
    • 应用列表:显示名称、类型、状态、工作空间、创建者、最近发布时间、创建时间。
    • +
    • 查询支持:支持按创建者、名称、类型、状态、工作空间查询。
    • +
    +

    支持关键词搜索和字段筛选,快速定位资源。

    +
    +

    资源

    +

    2 资源操作

    +
    +

    管理员可对不同类型资源执行特定操作,包括但不限于:

    +
      +
    • 应用:对话、管理、导出、删除、跳转查看等;
    • +
    • 知识库:支持管理、向量化、同步、生成问题、导出为 Excel 或 ZIP、配置设置、删除等;
    • +
    • 工具:支持参数配置、启用/停用、导出等;
    • +
    • 模型:支持修改、模型参数配置、删除等;
    • +
    +
    +

    资源

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/X-Pack/role/index.html b/v2/user_manual/X-Pack/role/index.html new file mode 100644 index 00000000..0619f8f4 --- /dev/null +++ b/v2/user_manual/X-Pack/role/index.html @@ -0,0 +1,3024 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 角色管理 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    角色管理

    +
    +

    角色是用户在系统中的身份,用于批量进行权限管理。

    +

    系统内置角色:

    +
      +
    • 系统管理员:所有系统管理中功能的权限设置以及用户信息中菜单权限。
        +
      • 可以查看所有角色(内置角色和自定义角色)的权限配置。
      • +
      • 可以操作所有功能,如创建或修改自定义角色配置、添加和移除成员。
      • +
      +
    • +
    • 工作空间管理员:拥有系统管理工作空间管理权限;应用、知识库、工具、模型所有功能权限。
        +
      • 可以查看普通用户角色和自定义普通用户角色的权限配置,不能进行权限编辑。
      • +
      +
    • +
    • 普通用户:可以维护自己创建的资源和被授权的资源,如创建的应用、知识库、工具、模型所有功能权限。
    • +
    +

    注意:系统内置角色不可以编辑权限,仅能添加/移除成员。

    +
    +

    角色管理

    +

    1 创建角色

    +
    +

    创建自定义角色:

    +
      +
    • 角色名称:1-64 个字符。
    • +
    • 继承角色:系统管理员、工作空间管理员和普通用户。
    • +
    +

    注意:系统管理员功能,工作空间管理员无此功能。

    +
    +

    新建角色

    +

    2 权限配置

    +
    +

    自定义角色创建成功,默认不勾选继承角色的所有权限。自定义角色可继承内置的 3 种角色进行自定义权限,如自定义系统管理员的权限设置,可以在内置系统管理员的权限范围内编辑。

    +
    +

    新建角色

    +
    +

    内置系统管理员角色权限:

    +
    +

    角色权限

    +
    +

    内置工作空间管理员角色权限:

    +
    +

    角色权限

    +
    +

    内置系普通用户角色权限:

    +
    +

    角色权限

    +

    3 成员管理

    +
    +

    支持按角色管理成员,点击【成员】,显示当前所选角色的成员列表。

    +

    工作空间管理员可以看到作为工作空间管理员角色的工作空间下的所有成员。

    +
    +

    成员管理

    +
    +

    添加成员:

    +
      +
    • 为当前角色添加成员,成员下拉列表可以多选。
    • +
    • 当前所选的角色为工作空间管理员或普通用户角色时,添加成员时选择完成后,还需要选择工作空间,工作空间列表也可以多选。
    • +
    +

    注意:工作空间管理员添加成员时,工作空间下拉列表仅列出工作空间管理员角色的工作空间。

    +
    +

    成员管理

    +
    +

    移除成员:

    +
      +
    • 用户在某个工作空间中的角色,若用户拥有多工作空间的成员,需要移除多次。
    • +
    • 成员移除后,登录系统则不再拥有该角色。
    • +
    • 内置系统管理员角色中的 admin 用户不能被移除。
    • +
    +
    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/X-Pack/shared_resources/index.html b/v2/user_manual/X-Pack/shared_resources/index.html new file mode 100644 index 00000000..a6fbddfa --- /dev/null +++ b/v2/user_manual/X-Pack/shared_resources/index.html @@ -0,0 +1,3021 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 共享资源 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    共享资源

    +

    1 概述

    +
    +

    企业版支持系统管理员创建共享资源(知识库、工具、模型),可授权给指定工作空间查看和使用。

    +

    注意:被授权的工作空间可以看到共享资源,但仅能查看和使用,不能编辑和删除。

    +
    +

    共享资源

    +
    +

    创建资源后授权工作空间:

    +
      +
    • 选择白名单:允许已选择的工作空间使用该共享资源。
    • +
    • 选择黑名单:除了已选择的工作空间,其他所有工作空间都可以使用该共享资源。
    • +
    +

    默认选择白名单,授权工作空间为空,则所有工作空间都不能看到这个资源。若用户修改授权类型为黑名单,授权工作空间为空,则所有工作空间都能查看这个资源。

    +
    +

    资源

    +

    2 知识库

    +
    +

    创建共享知识库操作与工作空间中创建知识库界面功能相同,切换共享知识库列表显示所有的共享知识库名称。
    +注意:向量模型仅可以选择共享模型的向量模型。

    +
    +

    资源

    +
    +

    授权工作空间可以查看和使用共享知识库。

    +
    +

    资源

    +
    +

    共享知识库在文档、问题、命中测试、对话以及设置的界面及功能,与在工作空间创建的知识库一致。

    +
    +

    资源

    +

    3 工具

    +
    +

    创建共享工具操作与工作空间中创建工具功能相同,切换共享工具列表显示全部的共享工具,也可单独选择工具和 MCP 进行创建。

    +
    +

    资源

    +
    +

    授权工作空间可以查看和使用共享工具。

    +
    +

    资源

    +

    4 模型

    +
    +

    创建共享模型操作与工作空间中创建模型功能相同,切换共享模型列表显示所有的共享模型名称。

    +
    +

    资源

    +
    +

    授权工作空间可以查看和使用共享模型。

    +
    +

    资源

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/X-Pack/system_API/index.html b/v2/user_manual/X-Pack/system_API/index.html new file mode 100644 index 00000000..f8cca6ec --- /dev/null +++ b/v2/user_manual/X-Pack/system_API/index.html @@ -0,0 +1,3079 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 系统API - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    + +
    + + + +
    +
    + + + + + + + + +

    系统 API

    +

    1 API Key 管理

    +
    +

    在页面右上方登陆用户图标下拉菜单中,点击【API Key 管理】菜单,进入 API Key 管理窗口,可以创建、启用/关闭、删除、设置 API Key 等操作。

    +
    +

    API-key

    +
    +

    创建 API Key 之后,点击【设置】下方可以配置是否允许跨域地址,默认不允许。

    +
    +

    API-key

    +

    2 API 调试

    +
    +

    打开 API 文档地址后,输入 API Key 进行授权,即可进行 API 在线调试。

    +
    +

    swagger

    +
    +

    注意:当使用的接口涉及应用对话时,Authorize 需填写应用的 API Key(application-0d5722xxxxxxxxx),否则会出现如下报错:

    +
    +

    swagger

    +

    3 开启身份验证的 API 调用

    +
    +

    开启身份验证后的 API 调用使用的 Authorize 与通过 API Key 进行对话的获取方式有所不同,以账号登录为例。

    +
    +

    登录认证

    +

    3.1 登录 API 地址

    +
    +

    点击用户头像,选择【API Key 管理】。

    +
    +

    打开api key管理

    +
    +

    创建 API Key,复制并打开【API 服务地址】。

    +
    +

    打开api文档

    +
    +

    点击【Authorize】,在【value】中输入系统的 API Key。

    +
    +

    登录api文档

    +

    3.2 获取 Authorize

    +
    +

    调用 captcha 接口,获取验证码,获取到的验证码是 Base64 编码的 PNG 图片数据。

    +

    注意:需自行将 Base64 数据解码并转换为图片文件。

    +
    +

    登录api文档

    +
    +

    在应用概览页面复制应用的 access_token。

    +
    +

    access_token

    +
    +

    在 API 地址找到对话用户/登录,输入 access_token,填入账号密码等信息,生成登录的 token。

    +
    +

    access_token +access_token

    +

    3.3 API 调用

    +
    +

    进入应用【概览】的 API 文档地址,将获取的 token 填入【Authorize】中,即可根据:通过 API Key 进行对话,正常进行 API 对话。

    +
    +

    API 登录 +API 登录

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/X-Pack/theme_settings/index.html b/v2/user_manual/X-Pack/theme_settings/index.html new file mode 100644 index 00000000..f49deccb --- /dev/null +++ b/v2/user_manual/X-Pack/theme_settings/index.html @@ -0,0 +1,2869 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 系统外观 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    外观设置

    +
    +

    可设置系统的主题色、网站 logo、登录 logo、登录背景图、网站名称、欢迎语等,以及主页右上方用户手册、论坛求助、项目地址等平台信息的显示设置。

    +
    +

    主题设置

    +

    主题设置

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/X-Pack/user/index.html b/v2/user_manual/X-Pack/user/index.html new file mode 100644 index 00000000..28683f19 --- /dev/null +++ b/v2/user_manual/X-Pack/user/index.html @@ -0,0 +1,3058 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 用户管理 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    用户管理

    +

    1 用户列表

    +
    +

    支持多用户体系,系统管理员可以创建及管理用户。

    +
    +

    用户列表

    +

    2 创建用户

    +
    +

    支持系统管理员创建用户:

    +
      +
    • 用户名:用户账号信息,不支持修改;
    • +
    • 姓名:用户姓名;
    • +
    • 邮箱:用户邮箱;
    • +
    • 手机号:用户手机号;
    • +
    • 默认密码:默认为MaxKB@123..
    • +
    • 角色设置:
        +
      • 用户可以设置多个角色,至少设置 1 个角色;
      • +
      • 选择普通用户和工作空间角色时需要设置工作空间;
      • +
      • 选择系统管理员角色无工作空间选项。
      • +
      +
    • +
    +
    +

    用户列表

    +

    3 编辑用户

    +
    +

    用户名不可以编辑,其他属性均可以编辑。

    +
    +

    用户列表

    +
    +

    用户状态已禁用,则用户无法登录 MaxKB。

    +
    +

    用户列表

    +

    4 重置密码

    +
    +

    系统管理员可以给每个用户修改密码,在用户列表中,点击【修改密码】,弹出修改密码对话框,保存后修改成功。

    +
    +

    用户列表

    +

    5 删除用户

    +
    +

    在用户列表中,点击【删除】,弹出提示框,确认后仅删除当前用户,不影响其创建的工作空间资源。
    +注意:系统内置 admin 用户不能被删除。

    +
    +

    用户列表

    +

    6 查询用户

    +
    +

    支持通过用户名、姓名、邮箱进行用户搜索。

    +
    +

    用户列表

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/X-Pack/workspace/index.html b/v2/user_manual/X-Pack/workspace/index.html new file mode 100644 index 00000000..9cb94e91 --- /dev/null +++ b/v2/user_manual/X-Pack/workspace/index.html @@ -0,0 +1,2976 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 工作空间 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    工作空间

    +
    +

    工作空间是 MaxKB 的组织单元,用于将相关的人员、资源、角色等进行集中管理。

    +
      +
    • 工作空间之间相互隔离;公共资源可通过共享资源进行分享。
    • +
    • 企业版创建工作空间没有数量限制。
    • +
    +
    +

    空间管理

    +

    1 空间管理

    +
    +

    创建工作空间:打开创建工作空间对话框,填写工作空间名称(必填,1-64 个字符,名称唯一,不能重复)。

    +
    +

    空间管理

    +
    +

    重命名工作空间:选择目标工作空间,点击【重命名】进行修改。

    +
    +

    空间管理

    +
    +

    删除工作空间:选择目标工作空间,点击【删除】。

    +
      +
    • 工作空间下有资源(知识库、应用、工具、模型)时,不允许被删除;无资源时允许被删除。
    • +
    • 系统内置的默认工作空间不能删除,可以进行重命名。
    • +
    +
    +

    空间管理

    +

    2 成员管理

    +
    +

    添加成员时需要选择角色,支持同时添加多个成员和多个角色。

    +
      +
    • 系统管理员支持为所有工作空间添加成员,工作空间管理员仅显示当前用户作为工作空间管理员角色的工作空间。
    • +
    • 工作空间管理员的角色列表仅显示普通用户角色和继承普通用户角色的自定义角色。
    • +
    +
    +

    空间管理

    +
    +

    移除成员点击【移除】后,移除成员的当前角色。

    +
    +

    空间管理

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/app/app-view/index.html b/v2/user_manual/app/app-view/index.html new file mode 100644 index 00000000..eebbc1d1 --- /dev/null +++ b/v2/user_manual/app/app-view/index.html @@ -0,0 +1,3036 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 应用概览 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    应用概览

    +
    +

    创建完应用,进入在概览页面可以进行启用/禁用/重新生成公开访问链接、演示、嵌入第三方、访问限制以及 API Key 管理。

    +
    +

    应用概览

    +

    1 公开访问链接

    +
    +

    公开访问链接支持开关设置和重新生成。点击演示或复制公开访问链接至浏览器进入问答页面。

    +
    +

    问答 +问答

    +
    +

    在问答后,可以点击右上角的导出按钮,可以选择将当前的对话记录导出为 Markdown、HTML 和 PDF 文件。

    +
    +

    问答

    +
    +

    当选择导出为 PDF 时,支持选择导出为 PDF 或图片。

    +
    +

    问答

    +
    +

    对于已打开的公开链接,如果此时关闭当前公开链接或重新生成新的公开访问链接,此时访问将提示:抱歉,当前正在维护,无法提供服务,请稍后再试!

    +
    +

    关闭服务

    +

    2 嵌入第三方

    +
    +

    MaxKB 应用支持零编码嵌入到企业的第三方系统。
    +在应用概览页面点击【嵌入第三方】,复制全屏模式、移动端模式或浮窗模式代码嵌入到第三方系统中,即可在第三方系统中进行问答。

    +
    +

    嵌入第三方

    +

    3 访问限制

    +
    +

    MaxKB 支持对应用设置每个客户端提问次数限制和嵌入第三方白名单防盗链设置。

    +

    注意:身份验证为 X-Pack 功能。

    +
    +

    访问限制

    +

    4 显示设置

    +
    +

    社区版本应用支持语言以及显示执行详情的设置。X-Pack 功能更多设置,详情见:应用显示

    +
    +

    访问限制

    +

    5 API 访问凭据

    +
    +

    如果外部系统需要通过 API 的方式进行调用,需要查看 API 文档和当前应用的 API Key,点击 【API Key 】,打开 API Key 的管理对话框,支持创建、启用/禁用、删除 API Key。

    +
    +

    API key

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/app/app/index.html b/v2/user_manual/app/app/index.html new file mode 100644 index 00000000..86eaf463 --- /dev/null +++ b/v2/user_manual/app/app/index.html @@ -0,0 +1,2992 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 应用概述 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    应用概述

    +

    1 功能概述

    +
    +

    MaxKB 提供预配置模板和组件,可快速创建基础问答应用,或对复杂业务流程进行高级编排,打造专属 AI 助手。

    +
    +

    应用概览

    +
    +
      +
    • 文件夹管理:应用通过文件夹进行管理,根目录下可建立最多三级的子文件夹。每一级文件夹内均可创建相应的应用。用户可以创建应用,也可以使用资源授权后的应用。
    • +
    • 状态功能:应用显示【未发布】或【已发布】状态(首次创建应用是保存未发布,即为未发布状态),以及发布时间。
    • +
    +
    +

    应用概览

    +

    2 应用类型

    +
    +

    简单配置:提供了较为基础的功能和设置选项,基本功能完备满足大多数基本的问答需求,适用于需要快速上线智能体应用。

    +

    高级编排:支持用户创建符合业务逻辑的工作流,包括但不限于使用判断器、问题优化、函数库、内置标签等功能,满足用户问题分类、敏感词检索等各类需求,适用于需要复杂逻辑和自定义工作流的场景。

    +
    +

    简单应用

    +

    高级编排

    +

    3 应用设置

    +
    +

    应用创建完成,进入到应用页面,查看应用概览以及进行相关设置、对接。

    +
    +

    应用概览

    +
    +

    注意:应用接入以及对话用户为 X-Pack 功能。

    +
    +
    +

    应用支持导出操作,导出后文件名称为:应用名称.mk。 +对于高级编排类型的应用,导出内容为包括工作流中所有节点的参数设置以及函数内容,流程节点中所选择的知识库和模型信息不导出。

    +
    +

    应用导出

    +
    +

    在应用页面,点击【导入应用】,即可导入应用文件(文件后缀为.mk)。

    +
    +

    应用导入

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/app/hit-testing/index.html b/v2/user_manual/app/hit-testing/index.html new file mode 100644 index 00000000..acc335f9 --- /dev/null +++ b/v2/user_manual/app/hit-testing/index.html @@ -0,0 +1,2848 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 命中测试 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    命中测试

    +
    +

    应用命中测试功能是简易配置类型应用针对用户提问进行一个模拟测试,用来调整分段内容和关联问题从而提高分段内容的匹配度,从而提升回答效果。输入测试问题,系统根据检索模式在当前应用关联的知识库中进行检索,然后按照相似度和返回Top 分段数筛选返回满足条件的分段。如有必要,可对指定返回分段内容进行再次编辑。

    +
    +

    命中测试

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/app/log/index.html b/v2/user_manual/app/log/index.html new file mode 100644 index 00000000..07fe74ad --- /dev/null +++ b/v2/user_manual/app/log/index.html @@ -0,0 +1,2981 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 对话日志 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    对话日志

    + +
    +

    在对话日志记录了所有用户会话中的问答详情,包括用户对AI 回答的反馈信息,维护人员可以通过查看对话日志详情并参考用户反馈进一步修正答案。

    +
    +
    +

    对话日志中,可以按摘要或用户进行查询。对话日志支持查询过去 7 天、30 天、90 天、过去半年的对内容。

    +
    +

    日志选择搜索

    +

    1 日志详情

    +
    +

    日志详情为每个用户真实的问答场景,问答中用户的反馈只能查看不能修改。

    +
    +

    日志详情

    +
    +

    点击日志列表中的摘要,可查看对话详细内容。

    +
    +

    引用分段

    +
    +

    运营人员可以根据用户提问、AI 回答以及用户的反馈来编辑和标注,并保存至知识库,进一步完善并提升效果。

    +
    +

    引用分段

    +

    2 清除策略

    +
    +

    应用对话记录默认保存期限是 180 天,如果要求保留更长时间,强烈建议修改此参数。设置清除策略期限后,系统将创建自动清除任务,并在次日 0 点执行。

    +
    +

    引用分段

    +

    3 日志导出

    +
    +

    支持将对话日志导出,查看详细的对话情况。

    +
    +

    引用分段

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/app/serialization/index.html b/v2/user_manual/app/serialization/index.html new file mode 100644 index 00000000..977b90b9 --- /dev/null +++ b/v2/user_manual/app/serialization/index.html @@ -0,0 +1,2881 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 应用导出与导出 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    应用导出与导出

    +

    1 应用导出

    +
    +

    应用支持导出操作,导出后文件名称为:应用名称.mk。 +对于高级编排类型的应用,导出内容为包括工作流中所有节点的参数设置以及函数内容,流程节点中所选择的知识库和模型信息不导出。

    +
    +

    应用导出

    +

    2 应用导入

    +
    +

    在应用页面,点击【导入应用】,即可导入应用文件(文件后缀为.mk)。

    +
    +

    应用导入

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/app/simple_app/index.html b/v2/user_manual/app/simple_app/index.html new file mode 100644 index 00000000..d32ff0f6 --- /dev/null +++ b/v2/user_manual/app/simple_app/index.html @@ -0,0 +1,2945 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 简单配置应用 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    简单配置应用

    +
    +

    点击【创建应用】,输入应用名称以及应用描述,选择【简易配置】,点击【创建】,进入简易配置应用设置页面。

    +
    +

    选择应用类型

    +
    +

    左侧为应用信息,右侧为调试预览界面。

    +
      +
    • 应用名称:提问时对话框的标题和名字。
    • +
    • 应用描述:对应用场景及用途的简要描述。
    • +
    • AI 模型:可选择在【模型】中添加的大语言模型,也可直接添加。
    • +
    • 角色设定:通过给模型指定一个特定的角色或身份,来指导模型的输出更加符合特定的场景或任务需求,可在点击右侧【生成】按钮,生成所需提示词。
    • +
    • 提示词:系统默认有智能知识库的提示词,用户可以自定义通过调整提示词内容,可以引导大模型聊天方向,该提示词会被固定在上下文的开头。
    • +
    • 历史聊天记录:大模型提交当前会话中最后 N 条对话内容,如果为 0,则仅向大模型提交当前问题。
    • +
    • 关联知识库:知识库可设置检索方式、知识库的相似度,引用分段数 Top-N 和最大引用字符数、无引用知识库分段时的回答策略以及是否进行问题优化等。
    • +
    • 开场白:打开对话时,系统弹出的默认引导说明。
    • +
    • MCP:通过引用 MCP 和自定义 MCP Server Config 两种方式进行调用,支持添加多个MCP,大模型将根据提示词内容调用合适的工具。
    • +
    • 工具:可以根据实际场景灵活选用自定义工具,系统自动将工具能力封装为MCP服务并对接模型,AI 能够根据对话上下文智能判断是否调用工具。
    • +
    • 输出 MCP/工具执行过程:开启后,模型在生成最终答案前,会先输出一段置于标签内的推理过程,随后再给出正式回复。
    • +
    • 语音输入:在语音输入完成后会转化为文字后再发送提问,需要语音识别模型的支持。
    • +
    • 语音播放:将大模型生成的回答内容转换为语音进行播放,需要语音合成模型的支持。
    • +
    +

    应用信息设置完成后,点击【保存并发布】后,应用设置才生效。

    +
    +

    应用设置 +应用设置

    +
    +

    提示词是在每次对话开始时固定注入的上下文指令,用于为模型确立身份、语气、知识边界及输出格式等前置规则,从而确保回复精准、风格一致且可控。

    +
      +
    • +

      变量支持:如 {data} 自动插入知识库片段,{question} 引用用户问题,实现精准、可控、低幻觉的智能回复。

      +
    • +
    • +

      典型配置示例

      +
        +
      • 角色锚定:你是一位专业的数据分析专家,精通 MySQL数据库SQL语言,能够熟练运用 mcp-mysql 工具进行SQL验证和查询,还能使用 quickchart-server 工具绘制图表,并对相关数据进行深入分析和解释。
      • +
      • 输出格式:请用 Markdown 表格呈现答案,并在末尾给出 20 字以内的总结。
      • +
      • 技能技能:生成并验证SQL、绘制图表、数据的分析和解释
      • +
      • 风格语气:保持亲切、简洁,避免使用专业术语。
      • +
      • 限制要求:仅围绕与生成SQL、利用工具查询验证、生成图片以及数据的分析和解释相关的内容进行回答,拒绝回答不涉及这些内容的话题。
      • +
      +
    • +
    +

    通过合理编排提示词,管理员可在不更换模型的前提下,实现多场景、多角色的快速切换,显著降低大模型幻觉风险并提升用户体验。

    +

    简易应用的系统提示词支持基于用户输入的主题内容,自动生成高质量、结构完整的系统提示词,辅助用户快速构建适用于当前场景的提示文本。

    +
    +

    应用设置

    +
    +

    开场白兼具“自我介绍”与“操作提示”的双重作用,能够在零打扰的前提下,告诉用户“我是谁、能做什么、该怎么问”。合理设计的开场白可显著降低首次使用门槛,提升后续问答效率。

    +
      +
    • 支持 Markdown,可插入粗体、链接、换行。
    • +
    • 支持使用 标签编写 HTML 代码。
    • +
    +

    可参考 MaxKB 开场白参考模板(基于 HTML 编写)

    +
    +

    应用设置应用设置

    +
    +

    当用户提问后,系统优先在已关联的知识库中执行分段检索,随后将命中的内容注入提示词,再交由大模型生成答案。应用设置时可以控制检索行为:

    +
      +
    • +

      检索模式

      +
        +
      • 向量检索:基于向量相似度,适合大数据量、语义匹配场景。
      • +
      • 全文检索:基于文本相似度,适合小数据量、关键词匹配场景。
      • +
      • 混合检索:同时启用向量 + 全文,兼顾精度与召回,适用于中等数据量。
      • +
      +
    • +
    • +

      相似度阈值:仅返回高于设定分值(默认 0.60)的段落,过滤低相关结果。

      +
    • +
    • 引用分段数 Top-N:控制最多向大模型提交 N 条高相关段落,避免上下文过长。
    • +
    • 最大引用字符数:对入选段落再做字符截断,确保总长度不超过设定上限(默认 5,000 字符)。
    • +
    • 无引用时的回答策略:允许大模型基于通用知识作答,或指定统一回复(如暂无相关资料”,拒绝编造)。
    • +
    • 问题优化开关:启用后,系统会先将用户问题改写为更利于检索的表述,再执行检索,提高命中率。
    • +
    +
    +

    应用设置

    +
    +

    输出思考:开启后,模型在生成最终答案前,会先输出一段置于标签内的推理过程,随后再给出正式回复。

    +

    注意:部分模型只输出单标签,无法进行关闭控制,需对模型进行配置优化。如 DeepSeek-R1-Distill-Qwen-32B。

    +
    +

    应用设置

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/app/workflow_app/index.html b/v2/user_manual/app/workflow_app/index.html new file mode 100644 index 00000000..8c5ef20b --- /dev/null +++ b/v2/user_manual/app/workflow_app/index.html @@ -0,0 +1,4155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 高级编排应用 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + +

    高级编排应用

    +
    +

    点击【创建】,选择【高级编排】,输入应用名称,可以根据需求选择模板,点击【创建】进入工作流编排页面。

    +
    +

    选择应用类型

    +
    +

    高级编排应用通过可视化工作流,将 AI 模型、知识库、业务逻辑、外部工具等节点自由组合,进行调试与发布。

    +

    注意:

    +
      +
    • 画布上的节点必须在工作流程中,不能有流程外的孤立节点,否则在发布时会校验失败。
    • +
    • 每个节点可以根据节点的用途进行重命名,双击节点名称即可重命名,但同一个工作流编排中节点名称不能重复。
    • +
    • 连线的后置节点可以引用前置节点的输出参数,如果节点名称变更,需要重新复制变量,参数引用方式是{{节点名称.变量名称}}
    • +
    +

    完成工作流程设计之后,使用左下方的画布控制栏,可以对画布进行整体调整,包括画布缩放、节点收缩以及流程一键优化。

    +
    +
    +

    默认画布

    +

    1 基础节点

    +
    +

    每个工作流由【基本信息】与【开始】两个基础节点构成,且均不可删除、不可复制。

    +
      +
    • 基本信息:用于配置应用级元数据:应用名称、应用描述、开场白、语音开关等。每个应用仅存在一个该节点。
    • +
    • 开始:作流执行的起点,所有后续节点均从此节点开始流转。每个应用仅存在一个该节点。
    • +
    +
    +

    1.1 基本信息

    +
    +

    节点说明:工作流的开始节点,有且唯一,不能删除和复制,问答页面输入的问题会作为该节点的输出参数 {question}, 后续节点如需引用可以复制输出参数或选择变量:开始节点->用户问题

    +
    +

    开始节点

    +
    +

    文件上传:开启后应用将支持在对话时上传文档。

    +
      +
    • 文档:TXT、MD、DOCX、HTML、CSV、XLSX、XLS、PDF;
    • +
    • 图片:JPG、JPEG、PNG、GIF;
    • +
    • 音频文件:MP3、WAV、OGG、ACC、M4A;
    • +
    +

    每次最多上传 10 个文件,单个文件不超过 100 MB,在后续节点中可以对上传后的文件进行处理。默认 3 个文件,单个文件不超过 50 MB。

    +
    +

    开始节点-文件上传

    +
    +
      +
    • 用户输入:在会话开始时,需要在用户端提供的必要信息,例如,岗位角色等,以便后续流程可以根据不同输入进行不同的流程设计。
    • +
    +
    +

    开始节点-用户输入

    +
    +
      +
    • 接口传参:在通过应用公开访问链接时可配置的参数。添加接口参数后将会在公开访问 URL 自动增加接口参数,在与第三方系统集成。
    • +
    • 会话变量:变量在当前对话流程中全程有效,用于实现节点间数据传递与逻辑判断。
    • +
    • 语音输入:开启后将支持以语音的方式进行问题的输入,需要使用语音识别模型。
    • +
    • 语音播放:开启后回答内容将以语音的方式进行播放,可以使用浏览器内置的播放,也可以使用语音合成模型进行播放。
    • +
    +
    +

    开始节点-用户输入

    +

    1.2 开始

    +
    +

    作为工作流执行的起点,所有后续节点均从此节点开始流转。 +全局变量:

    +
      +
    • 当前时间 {time}:当前对话的时间。
    • +
    • 历史聊天记录 {history_context}:对话的历史记录。
    • +
    • 对话id {chat_id}:对话标识。
    • +
    +

    参数输出:

    +
      +
    • 用户问题 {question}:客户端输入的提问信息。
    • +
    • 文档 {document}:客户端上传的文档。
    • +
    +
    +

    开始节点-用户输入

    +
    +

    点击画布右上角【添加组件】,即可通过“点击”或“拖拽”方式将所需节点加入工作流。组件按功能分为三大类,具体说明如下:

    +
      +
    • 基础组件:覆盖 AI 能力、知识库、业务逻辑等。
    • +
    • 工具:通过函数方式灵活处理复杂需求。
    • +
    • 应用:一键引入其他已发布的应用作为子流程,直接复用其问答结果,实现快速拼装与能力复用。
    • +
    +
    +

    编排画布

    +

    2 基本组件

    +

    2.1 AI 能力

    +

    2.1.1 AI 对话

    +
    +

    节点说明:如果应用需要与 AI 大模型进行对话,则需要在编排中添加 AI 对话组件。

    +

    节点设置:

    +
      +
    • AI 模型:大语言模型的名称以及参数控制。
    • +
    • 系统提示词:大语言模型回答的角色或身份设定。
    • +
    • 用户提示词:引导模型生成特定输出的详细描述。提示词可以引用前置节点的参数输出,如可以引用前置知识库检索的检索结果和开始节点的问题变量。
    • +
    • +

      历史聊天记录:在当前对话中有关联的历史会话内容。例如,历史聊天记录为 1,表示当前问题以及上一次的对话内容一起输送给大模型。

      +
        +
      • 选择节点:会使用当前 AI 对话节点的提示词信息和节点返回的内容作为上下文;
      • +
      • 选择工作流:会使用对话框中用户输入的问题和最终回复的内容做为上下文。
      • +
      +
    • +
    • +

      MCP:支持添加多个 MCP,通过引用 MCP 和自定义 MCP Server Config 配置两种方式实现对 MCP 的调用,大模型会根据提示词内容会主动调用合适的工具。

      +
    • +
    • 工具:可以根据实际场景灵活选用自定义工具,系统自动将工具能力封装为MCP服务并对接模型,AI能够根据对话上下文智能判断是否调用工具。
    • +
    • 输出 MCP/工具执行过程:开启后,模型在生成最终答案前,会先输出一段置于标签内的推理过程,随后再给出正式回复。
    • +
    • 输出思考:对于模型反馈思考过程的设置与开启,默认开始和结束标签是 <think></think>
    • +
    • 返回内容:是否在对话中显示该节点返回的内容。
    • +
    +

    参数输出:

    +
      +
    • 回答内容 {answer}:根据角色、提示词等内容大语言模型返回的内容。
    • +
    • 思考过程 {reasoning_content}:AI 模型的思考过程。
    • +
    +

    注意:MCP 工具的调用需要大语言模型支持函数调用,如果大语言模型不支持,则配置无效。

    +
    +

    AI对话

    +
    +

    提示词是在每次对话开始时固定注入的上下文指令,用于为模型确立身份、语气、知识边界及输出格式等前置规则,从而确保回复精准、风格一致且可控。

    +
      +
    • 变量支持:如 {data} 自动插入知识库片段,{question} 引用用户问题,实现精准、可控、低幻觉的智能回复。
    • +
    +

    通过合理编排提示词,管理员可在不更换模型的前提下,实现多场景、多角色的快速切换,显著降低大模型幻觉风险并提升用户体验。

    +

    AI 对话节点支持基于用户输入的主题内容,自动生成高质量、结构完整的系统提示词,辅助用户快速构建适用于当前场景的提示文本。

    +
    +

    应用设置

    +
    +

    MCP:引用 MCP和自定义 MCP Server Config。

    +
    +

    AI对话MCP +AI对话自定义

    +
    +

    工具:支持添加【工具】中已启用的工具。

    +
    +

    AI对话工具

    +

    2.1.2 意图识别

    +
    +

    节点说明:根据输入进行意图的分类识别。

    +

    节点设置:

    +
      +
    • AI 模型:大语言模型的名称以及参数控制。
    • +
    • 输入:待进行意图识别的内容。
    • +
    • 历史聊天记录:在当前对话中有关联的历史会话内容。例如,历史聊天记录为 1,表示当前问题以及上一次的对话内容一起输送给大模型。
    • +
    • 意图分类:每个意图分类的名称。
    • +
    +

    参数输出:

    +
      +
    • 分类 {category}:根据意图分类的类型,返回分类名称。
    • +
    • 理由 {reason}:判断意图分类的理由。
    • +
    +
    +

    意图识别

    +

    2.1.3 图片生成

    +
    +

    节点说明:根据文本描述生成对应的图片。

    +

    节点设置:

    +
      +
    • 图片生成模型:图片生成模型名称。
    • +
    • 提示词(正向):引导模型生成积极、建设性输出的文字输入。
    • +
    • 提示词(负向):不应该包含在生成输出中的元素、主题或特征的描述。
    • +
    • 返回内容:是否在对话中显示该节点返回的内容。
    • +
    +

    参数输出:

    +
      +
    • AI 回答内容 {answer}:即图片生成模型根据文本输入生成的图片。
    • +
    • 图片 {image}: 生成图片的详细信息。
    • +
    +
    +

    图片生成

    +

    2.1.4 图片理解

    +
    +

    节点说明:对用户上传的图片文件进行分析和理解。

    +

    节点设置:

    +
      +
    • 图片理解模型:图片理解模型名称。
    • +
    • 角色设定:回答的角色或身份设定。
    • +
    • 提示词:引导模型生成特定输出的详细描述。
    • +
    • +

      历史聊天记录:在当前对话中有关联的历史会话内容。

      +
        +
      • 选择节点:会使用当前图片理解节点的提示词信息和节点返回的内容作为上下文;
      • +
      • 选择工作流:会使用对话框中用户输入的问题和最终回复的内容做为上下文。
      • +
      +
    • +
    • +

      选择图片:待理解和分析的图片,默认为当前用户上传的图片文件。

      +
    • +
    • 返回内容:是否在对话中显示该节点返回的内容。
    • +
    +

    参数输出:

    +
      +
    • AI 回答内容{answer}:根据上传的图片以及角色、提示词等信息图片理解模型返回的内容。
    • +
    +
    +

    图片理解

    +

    2.1.5 文本转语音

    +
    +

    节点说明:将文本转换为音频。

    +

    节点设置:

    +
      +
    • 语音合成模型:选择可用语音合成模型的名称。
    • +
    • 文本内容:选择待合成的文本内容。
    • +
    • 返回内容:是否在对话中显示该节点返回的内容。
    • +
    +

    参数输出:

    +
      +
    • 结果 {result}:将文本转成的音频内容。
    • +
    +
    +

    文本转语音

    +

    2.1.6 语音转文本

    +
    +

    节点说明:将音频文件转换为文本。

    +

    节点设置:

    +
      +
    • 语音识别模型:选择语音识别模型的名称。
    • +
    • 语音文件:即上传的音频文件,支持的格式包括:mp3、wav、ogg、acc。
    • +
    • 返回内容:是否在对话中显示该节点返回的内容。
    • +
    +

    参数输出:

    +
      +
    • 结果 {result}:语音转换后的文本内容。
    • +
    +
    +

    语音转文本

    +

    2.1.7 文生视频

    +
    +

    节点说明:根据文本描述生成对应的视频。

    +

    节点设置:

    +
      +
    • 文生视频模型:选择文生视频模型名称。
    • +
    • 提示词(正向):引导模型生成积极、建设性输出的文字输入。
    • +
    • 提示词(负向):不应该包含在生成输出中的元素、主题或特征的描述。
    • +
    • 返回内容:是否在对话中显示该节点返回的内容。
    • +
    +

    参数输出:

    +
      +
    • 视频 {video}:根据文本生成的视频内容。
    • +
    +
    +

    语音转文本

    +

    2.1.8 图生视频

    +
    +

    节点说明:根据图片生成对应的视频。

    +

    节点设置:

    +
      +
    • 图生视频模型:选择图生视频模型名称。
    • +
    • 提示词(正向):引导模型生成积极、建设性输出的文字输入。
    • +
    • 提示词(负向):不应该包含在生成输出中的元素、主题或特征的描述。
    • +
    • 首帧图片:必填,待生成视频的图片,选择开始中用户上传的图片文件。
    • +
    • 尾帧图片:非必填,图生视频尾帧的图片,可以规范视频的生成
    • +
    • 返回内容:是否在对话中显示该节点返回的内容。
    • +
    +

    参数输出:

    +
      +
    • 视频 {video}:根据图片生成的视频内容。
    • +
    +
    +

    图生视频

    +

    2.1.9 问题优化

    +
    +

    节点说明:根据当前会话的历史聊天记录,以及在节点设置的大预言模型和提示词,对当前问题进行智能优化。

    +

    节点设置:

    +
      +
    • AI 模型:大语言模型的名称以及参数控制。
    • +
    • 角色设定:大语言模型回答的角色或身份设定。
    • +
    • 提示词:引导模型生成特定输出的详细描述。
    • +
    • 历史聊天记录:在当前对话中有关联的历史会话内容。例如,历史聊天记录为 1,表示当前问题以及上一次的对话内容一起输送给大模型。
    • +
    • 返回内容:是否在对话中显示该节点返回的内容。
    • +
    +

    参数输出:

    +
      +
    • 问题优化结果 {answer}:通过大模型优化后的问题。
    • +
    +
    +

    问题优化

    +

    2.2 知识库

    +

    2.2.1 知识库检索

    +
    +

    节点说明:如果应用需要关联知识库,则需要在编排中添加知识库检索节点,选择知识库、设置检索参数、选择检索的问题。

    +

    节点设置:

    +
      +
    • 知识库:待检索的知识库。
    • +
    • 检索参数:包括检索模式、相似度阈值、引用分段数量以及最大引用字符数。
    • +
    • 检索问题:一般是开始节点的用户问题。
    • +
    • 结果显示在知识来源中:默认关闭,开启后可以在回答结果中显示知识来源。
    • +
    +

    参数输出:

    +
      +
    • 检索结果的分段列表 {paragraph_list}:数组类型,指根据检索问题、检索参数进行检索后命中的分段列表,包含了分段的所有属性;
    • +
    • 满足直接回答的分段列表 {is_hit_handling_method_list}:数组类型,指根据检索问题、检索参数进行检索后命中的分段中满足直接回答的所有分段列表,包含了分段的所有属性;
    • +
    • 检索结果 {data}:字符串类型,指根据检索问题、检索参数进行检索后命中的分段内容;
    • +
    • 满足直接回答的分段内容 {directly_return}:字符串类型,指根据检索问题、检索参数进行检索后命中的分段中满足直接回答的所有分段内容。
    • +
    +
    +

    知识库检索

    +

    2.2.2 多路召回

    +
    +

    节点说明:根据需要重排的内容、检索问题以及检索参数进行多路召回。

    +

    节点设置:

    +
      +
    • 重排内容:待重排的多个内容,一般是多个不同知识库的检索结果。
    • +
    • 检索参数:包括 score 阈值、引用分段数以及最大引用字符数。
    • +
    • 检索问题:根据检索问题进行重排,一般为用户问题或问题优化后的结果。
    • +
    • 重排模型:需要使用的重排模型名称。
    • +
    +

    参数输出:

    +
      +
    • 重排结果列表 {result_list}:数组类型,指根据重排后的结果列表。
    • +
    • 重排结果 {result}:字符串类型,指根据检索参数后的重排结果。
    • +
    +
    +

    多路召回

    +

    2.3 业务逻辑

    +

    2.3.1 判断器

    +
    +

    节点说明:根据不同的条件进行逻辑判断,每个判断分支后面必须有后置执行节点。

    +

    判断器节点输出参数说明:

    +
      +
    • 分支名称{branch_name}:每个判断分支的名称。
    • +
    +
    +

    判断器

    +

    2.3.2 表单收集

    +
    +

    节点说明:通过表单的设计,以引导的方式主动获取必要的信息,一般应用于需要多次询问的应答场景。

    +

    节点设置:

    +
      +
    • 表单输出内容:表单提示说明以及表单内容,可以单项输入,也可以输入多项信息。
    • +
    • 表单配置:通过添加不同的组件进行表单的设计。
    • +
    +

    参数输出:

    +
      +
    • 表单全部内容{form_data}:表单的全部内容。
    • +
    +

    表单全部内容将作为固定的输出,对于各个表单项也都进行参数化输出。

    +
    +

    表单收集

    +
    +

    表单添加参数的组件类型支持文本框、多行文本框、JSON 文本框、密码框、单选框、多选框、选项卡、单行选项卡、单行多选卡、滑块、开关、日期和文件上传。

    +
    +

    多行文本框 +文件上传

    +
    +

    表单参数支持引用变量或参数输入:

    +
      +
    • 组件类型为【单选框、多选框、选项卡、单行选项卡、单行多选卡、JSON文本框】时,赋值方式中可选择自定义或引用变量,默认为:自定义。引用变量的格式可参考【引用变量】旁的提示信息。
    • +
    +
    +

    参数格式

    +
    +
      +
    • 【文本框、多行文本框、密码框】组件的默认值支持参数输入。参数格式参考:{{开始.question}}
    • +
    +
    +

    参数输入

    +

    2.3.3 变量赋值

    +
    +

    节点说明:更新全局变量的值。

    +
    +

    变量赋值

    +

    2.3.4 指定回复

    +
    +

    节点说明:指定输出文本内容,在知识库查询到的相关内容满足直接回答的要求,可以输出检索内容,也可以在知识库没有查询到关联内容时,指定回复内容。

    +

    输出参数:

    +
      +
    • 内容{answer}: 指定回复输出的内容。
    • +
    +
    +

    指定回复

    +

    2.3.5 循环节点

    +
    +

    节点说明:通过设置循环类型和循环体,在满足特定条件前重复执行任务序列。添加循环节点后,会生成一个循环节点和对应的循环体画布。

    +

    循环类型:循环类型是循环节点的运行模式,支持设置为数组循环、指定次数循环和无限循环。

    +
      +
    • 数组循环:基于数组数据驱动循环,支持遍历数组中的每一项元素,依次执行任务,适用于“按数据量批量处理”的使用场景;
        +
      • 循环数组:选择待进行循环的数组内容。
      • +
      +
    • +
    • 指定次数循环:按预设固定次数执行循环,用户可以直接设置任务重复运行的具体次数(如循环 5 次、10 次),可以满足“明确次数的重复操作”的使用需求;
        +
      • 循环次数:设置循环次数,如果小于 1,则设置为 1。
      • +
      +
    • +
    • 无限循环:无固定终止条件,任务将持续重复执行,直至满足停止条件时终止,默认最大循环 1000 次,适用于“需长期运行,并等待特定事件触发”的使用场景。
    • +
    +
    +

    循环数组 +循环次数 +无线循环

    +
    +

    输出参数:在循环体中【循环开始】设置的循环变量,可以作为循环节点的输出参数,供各工作流节点调用。

    +
    +

    输出参数

    +
    +

    循环体:循环体画布用于编排循环的逻辑,每次循环时,工作流会执行循环体画布中的工作流。

    +
    +

    循环

    +
    +

    循环开始:作为循环执行的起点,循环体中所有后续节点均从此节点开始流转。

    +

    节点设置:

    +
      +
    • 循环变量:循环体中支持设置循环变量,该变量可作用于每一次循环。循环变量通常与变量赋值搭配使用,在每次循环结束后为中间变量设置一个新的值,并在下次循环中使用新的值。循环变量可以作为循环节点的输出参数,供循环体外工作流的节点调用。
    • +
    +

    循环变量:【节点设置】中添加的循环变量,支持在循环体中引用。

    +

    输出参数:

    +
      +
    • 下标{index}:数组中元素的位置。索引从 0 开始计数,表示第一次循环,1 表示第二次循环,2 表示第三次循环,以此类推。最后一次循环的索引为 n-1,其中 n 为循环次数。
    • +
    • +

      循环元素{item}:数组中的单个数据。数组由多个元素组成,每个元素可以是数字、字符、字符串等数据类型。

      +
      例如:数组 array=[23,26,37,88,90],array[0]的 index 是 0,item 为 23; array[4]的 index 是 4,item 为 90。
      +
      + +
    • +
    +
    +

    循环开始

    +
    +

    Continue:用于终止当前循环,执行下次循环。

    +

    添加条件:添加终止当前循环的条件,当满足条件时,终止当前循环,执行下次的循环。

    +
    +

    循环continue

    +
    +

    Break:终止当前循环,跳出循环体.

    +

    添加条件:添加终止当前循环的条件,当满足条件时,终止当前循环,跳出循环体,继续工作流。

    +
    +

    循环break

    +
    +

    注意

    +
      +
    • 循环体内不支持添加循环节点,避免造成死循环;
    • +
    • 循环类型为无限循环时,默认最大循环 1000 次,如需修改配置参数,则需要在 ${MAXKB_BASE}/maxkb/.env(默认是 /opt/maxkb/.env)文件中进行修改,并且在修改完后需执行 mkctl reload 命令重新加载配置文件。
    • +
    +
    +

    2.4 其他

    +

    2.4.1 MCP 调用

    +
    +

    节点说明:通过 SSE/Streamable_HTTP 协议调用 MCP 服务中的工具。

    +

    节点设置:

    +
      +
    • MCP Server Config:支持引用 MCP,也支持自定义 MCP 服务(使用 JSON 格式填写 MCP Server 配置参数)。
    • +
    • 工具:对应 MCP Server下的工具列表。
    • +
    +

    工具参数:MCP 工具对应的请求参数,可自定义,也可引用变量。

    +

    参数输出:

    +
      +
    • 结果 {result}:MCP 工具执行返回结果。
    • +
    +
    +

    MCP 节点

    +
    +
    MCP Server Config 格式参考如下
    +{
    +    "amap-maps": {
    +      "url": "http://IP:端口/MCPserver名称",
    +      "transport":"sse"               # 如果使用 Streamable_HTTP 协议,需将"sse"替换成"streamable_http"
    +    }
    +}
    +
    +
    +

    2.4.2 文档内容提取

    +
    +

    节点说明:对用户上传的文档进行内容总结。

    +

    节点设置:

    +
      +
    • 选择文档:即用户上传的文档,需要在基本信息节点开启对文件上传的支持。
    • +
    +

    参数输出:

    +
      +
    • 文档输出 {content}:对用户上传文件进行的总结输出。
    • +
    +
    +

    文档内容提取

    +

    2.4.3 自定义工具

    +
    +

    在高级编排流程中,编写 Python 代码和添加参数创建工具数作为流程中的一个处理节点,以灵活处理复杂需求,函数详细说明见:工具

    +
    +

    添加函数

    +

    2.5 工具

    +
    +

    在高级编排流程中,可以添加工具中的一个处理节点,以灵活处理复杂需求,函数详细说明见:工具

    +

    节点设置:即工具的输入参数。

    +

    参数输出:即工具的返回结果。

    +
    +

    添加函数

    +

    2.6 应用

    +
    +

    在高级编排流程中,可以添加其它应用(简单配置应用和流程编排应用)作为流程中的一个处理节点,直接快速利用子应用的问答结果。

    +

    节点设置:

    +
      +
    • 用户问题:对子应用的提问信息。
    • +
    • 返回内容:开启后在对话过程中将子应用的返回结果。
    • +
    +

    参数输出:

    +
      +
    • 结果:即子应用的返回结果。
    • +
    +
    +

    添加函数

    +

    3 其它说明

    +

    3.1 执行条件

    +
    +

    MaxKB 工作流中支持多出多进,在这个情况下,汇集节点可以根据与前置节点的逻辑关系,选择执行条件。

    +
      +
    • 所有:需要等所有前置连线节点全部执行完成后,才可执行当前节点。
    • +
    • 任一:任一前置连线节点执行完成后,即可执行当前节点。
    • +
    +
    +

    执行条件

    +

    3.2 调试

    +
    +

    完成所有的编排设计后,可点击【调试】后,先校验流程是否合规,校验通过后可在当前页面进行对话测试。

    +
    +

    调试预览

    +
    +

    在调试对话框中进行提问,AI 回答完成后,会显示【执行详情】,点击【执行详情】后,在弹出执行详情对话框中可以查看每个流程节点的执行状态、耗时以及其它执行信息。

    +
    +

    执行详情

    +

    3.3 发布历史

    +
    +

    应用高级编排中,支持查看发布历史版本的工作流、时间和用户。

    +
    +

    发布历史

    +
    +

    可对历史发布的版本时间进行编辑。

    +
    +

    发布历史 +发布时间修改

    +
    +

    可恢复历史版本的工作流。

    +
    +

    恢复版本 +恢复版本

    +

    3.4 自动保存

    +
    +

    高级编排流程默认手动保存,也可设置自动保存,开启自动保存后将每隔 1 分钟保存到本地,并在发布成功后将配置同步到后台数据库。

    +
    +

    自动保存

    +

    3.5 发布

    +
    +

    点击【发布】后会先校验当前工作流是否符合规则,如果合规将成功发布,否则发布失败。发布成功后,所有节点配置修改才在问答页面中生效。

    +

    可以点击【去对话】进行 AI 问答,也可以查看发布历史并进行版本恢复。

    +
    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/chat_to_API/index.html b/v2/user_manual/chat_to_API/index.html new file mode 100644 index 00000000..ca1f0b11 --- /dev/null +++ b/v2/user_manual/chat_to_API/index.html @@ -0,0 +1,3079 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 通过 API KEY 进行对话 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    + +
    +
    + + + +
    +
    + + + + + + + + +

    通过API KEY进行对话

    +
    +

    MaxKB 创建的应用支持通过 OpenAI SDK 格式以及提供系统 SDK 接入,专业版在社区版本基础上提供平台级别的完整 SDK,详细情况见:系统API

    +
    +

    1 标准OpenAI API格式

    +
    +

    MaxKB 应用兼容 OpenAI API 格式,在 OpenAI API 原有调用方式的基础上替换为 MaxKB 应用提供的 Base URL 以及 API Key 即可。

    +
    +

    api示例

    +
    +

    注意:

    +
      +
    • +

      openai url 的格式为: Base URL/chat/completions

      +
    • +
    • +

      openai Authorization 的格式为:Bearer API Key

      +
    • +
    +
    +
    +
    # 将 url 和 Authorization 替换为 MaxKB 应用实际真实的 Base URL 和 API Key。
    +
    +curl https://maxkb.fit2cloud.com/chat/api/xxxxxxxx-3fdf-7941-a6f4-0572478f57f6/chat/completions \
    +    -H "Content-Type: application/json"  \
    +    -H "Authorization: Bearer application-xxxxxxxxxx987f1bc06ab16e0ef"   \
    +    -d '{
    +        "model": "gpt-3.5-turbo",
    +        "messages": [
    +            {
    +              "role": "你是杭州飞致云信息科技有限公司旗下产品 MaxKB 知识库问答系统的智能小助手,你的工作是帮助 MaxKB 用户解答使用中遇到的问题,用户找你回答问题时,你要把主题放在 MaxKB 知识库问答系统身上。",
    +              "content": "MaxKB 是什么?"
    +            }
    +        ]
    +    }'
    +
    +
    +

    2 系统 API

    +

    2.1 打开 API 文档

    +
    +

    在应用【概览】中,点击访问 MaxKB API 地址,在 API Key 中创建 API Key。

    +
    +

    打开文档 +打开文档

    +

    2.2 API Key 认证

    +
    +

    点击【Authorize】,输入已创建的 API Key。

    +
    +

    API 认证

    +

    2.3 获取会话信息

    +
    +

    通过调用 open 接口,可以生成会话 id。

    +
    +

    会话ID

    +

    2.4 进行会话

    +
    +

    调用对话接口,填入已获取的会话 id,输入问题等参数信息,即可进行对话。

    +
    +

    对话 +对话

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/dataset/dataset/index.html b/v2/user_manual/dataset/dataset/index.html new file mode 100644 index 00000000..7b6bfef4 --- /dev/null +++ b/v2/user_manual/dataset/dataset/index.html @@ -0,0 +1,3278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 知识库 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + +

    知识库

    +
    +

    企业私有的专业知识库,包含各种类型的数据。支持创建和管理知识库,为问答对话提供知识来源,助力智能问答。

    +
      +
    • 共享知识库:系统管理员在【共享资源】中创建共享后,可以授权给指定工作空间。
    • +
    • 全部知识库:用户可以创建知识库,其他用户资源授权后可以查看、使用和维护。
    • +
    +

    知识库通过文件夹进行管理,根目录下可建立最多三级的子文件夹。每一级文件夹内均可创建相应的知识库。用户可以创建知识库,也可以使用资源授权后的知识库。

    +

    注意:共享资源为企业版 X-Pack 功能。

    +
    +

    1 创建知识库

    +
    +

    打开【知识库】页面,点击【创建知识库】,进入创建知识库页面。
    +知识库类型:

    +
      +
    • 通用型知识库:对离线文档上传管理,支持的文本文档格式包括 Markdown、TXT、PDF、DOCX、HTML,以及 Excel、CSV 格式的 QA 问答对。
    • +
    • Web 站点知识库:用于获取在线静态文本数据管理,输入 Web 根地址后自动同步根地址及子级地址的文本数据。
    • +
    • 飞书知识库:支持对接飞书的云文档和表格文档,将飞书文档内容导入到 MaxKB 中进行管理。
    • +
    +

    注意:飞书知识库 X-Pack 功能,具体使用可参考飞书文档

    +
    +

    dataset

    +

    1.1 通用型知识库

    +
    +

    选择知识库类型为通用型,输入知识库名称、知识库描述,选择向量模型。

    +
    +

    创建通用型知识库

    +
    +

    创建知识库后,支持新建文档和上传离线文档。

    +
    +

    上传文档

    +
    +

    可离线文档通过拖拽或选择文件方式进行上传。 上传文档要求:

    +
      +
    • 文本文件:Markdown、TXT、PDF、DOCX、HTML、XLS、XLSX、CSV、ZIP;
    • +
    • 表格:XLS、XLSX、CSV、ZIP;
    • +
    • QA 问答对:XLS、XLSX、CSV、ZIP;
    • +
    • 默认每次最多上传 50 个文件,每个文件不超过 100 MB,可配置,上传文件数量最多为 1000,单个文档最大 1000 MB;
    • +
    • 支持选择文件夹,上传文件夹下符合要求的文件。
    • +
    • +

      ZIP 文件包括两种形式:

      +
        +
      • Markdown 文档 + 图片文件,MarkDown 文档中引入对应的图片,并将两者打包在 ZIP 中。
      • +
      • XLS/XLSX 文件 + 图片文件,XLS/XLSX 文件中引入对应的图片,并将两者打包在 ZIP 中。
      • +
      +
    • +
    +
    +

    上传文档

    +
    +

    文档分段:

    +
      +
    • +

      选择分段规则,支持智能分段以及高级分段两种方式:

      +
        +
      • 智能分段:按照 Markdown 格式进行逐级下钻式分段(最多支持 6 级标题),每段最大字符数为 4096 个;
      • +
      • 高级分段:支持自定义设置分段标识符、分段长度及自动清洗。分段标识还支持使用正则表达式处理复杂结构文档。
      • +
      +
    • +
    • +

      导入时添加分段标题为关联问题:勾选后会把所有分段的标题设置为分段的关联问题。

      +
    • +
    • +

      分段预览:根据分段规则和设置,查看分段效果。

      +
    • +
    • 分段操作:在分段预览中对不合理的分段进行再次编辑以及删除无意义分段。
    • +
    • 步骤操作:可返回上一步重新上传文档,或者确认上传开始向量化。
    • +
    +
    +

    上传文档

    +
    +

    智能分段与高级分段

    +

    智能分段

    +
      +
    • +

      MarkDown 类型文件智能分段规则

      +
        +
      • 根据标题逐级下钻式分段(最多支持 6 级标题),每个段落最多 4096 个字符;
      • +
      • 当最后一级的文本段落字符数超过设置的分段长度时,会查找分段长度以内的回车进行截取。
      • +
      +
    • +
    • +

      HTML、DOCX 类型智能分段规则

      +
        +
      • 识别标题格式转换成 markdown 的标题样式;
      • +
      • 逐级下钻进行分段(最多支持 6 级标题),每个段落最多 4096 个字符。
      • +
      +
    • +
    • +

      TXT和 PDF 类型文件智能分段规则

      +
        +
      • 按照标题# 进行分段,若没有#标题的则按照字符数 4096 个字符进行分段;
      • +
      • 查找分段长度以内的回车进行截取。
      • +
      +
    • +
    +

    高级分段

    +
      +
    • 分段标识支持:#、##、###、####、#####、######、-、空行、回车、空格、分号、逗号、句号,并支持手动输入其它分段标识符或正则表达式
    • +
    • 分段长度:单个分段的长度,范围 50 至 4096 个字符。
    • +
    • 自动清洗:开启后系统会自动去掉重复多余的符号如空格、空行、制表符等。
    • +
    • 文档规范建议
        +
      • 标识规范:离线文档的分段标识要有一定规范,否则拆分出来的段落不规整。
      • +
      • 段落完整:在一个分段中集中描述一个完整的内容。
      • +
      +
    • +
    +
    +

    高级分段

    +
    +

    导入时添加分段标题为关联问题: 勾选后会把所有分段的标题设置为分段的关联问题。

    +
    +

    设置标题为关联问题

    +
    +

    点击【开始导入】后,系统后台会对文档进行自动分段 -> 存储 -> 向量化操作,处理结束后,文件状态将显示为完成。

    +
    +

    编辑分段

    +

    1.2 Web 站点知识库

    +
    +

    输入知识库名称、知识库描述,选择向量模型并设置知识库类型为 Web 站点。

    +
      +
    • Web 根地址:为在线静态网页站点的根节点地址,系统会自动获取 Web 根地址及子级地址的数据资料。以 DataEase V2 在线文档为例,可在 Web 根地址为:https://dataease.io/docs/v2/
    • +
    • 选择器:针对 Web 页面的数据可以设置定获取某个div内的数据,默认获取 body 数据。如 DataEase 在线文档仅获取中间内容部分,可以右键检查网页,定位到中间内部区域找到 div 为 md-content,则选择器输入为:.md-content 。
    • +
    +
    +

    Web知识库

    +

    Alt text

    +
    +

    点击【创建】后,跳转到文档列表页面查看当前 Web 站点下文档的详细信息,处理结束后,文件状态将显示为完成。

    +
    +

    Alt text

    +

    2 知识库操作

    +
    +

    MaxKB 知识库支持同步、重新向量化、生成问题、转移、设置、导出以及删除操作。

    +
    +

    知识库导出

    +

    2.1 同步 Web 知识库

    +
    +

    对于 Web 站点类型知识库,点击知识库面板的【同步】,支持对 Web 知识库的内容进行同步更新。

    +
      +
    • 同步替换:重新获取 Web 站点文档,覆盖替换本地知识库中的文档。
    • +
    • 整体同步:先删除本地知识库的所有文档,重新获取 Web 站点文档。
    • +
    +
    +

    知识库导出

    +

    2.2 重新向量化

    +
    +

    如果在知识库设置中选择了不同的向量模型,对于新增的文档将使用新设置的向量模型进行向量化,如果要对已有的知识库进行重新向量化,可在知识库卡片网格中,点击知识库面板的【重新向量化】,对知识库中已有的分段进行重新向量化。

    +
    +

    知识库导出

    +

    2.3 设置知识库

    +
    +

    在知识库列表,点击知识库面板的【设置】进入知识库设置页面,可以对当前知识库名称、描述、向量模型等属性进行修改,所有设置保存后设置生效。

    +
    +

    知识库设置页面

    +

    2.4 导出知识库

    +
    +

    在知识库列表,点击知识库面板的【导出 Excel】/【导出 ZIP】。将知识库的分段内容以 Excel 或 ZIP 文件格式导出。
    +每个文档为 Excel 文件的一个 Sheet,Sheet 每一行展示一个分段。导出 ZIP 文件时,会将引用的图片一起导出,且以 guid 的方式进行命名,且没有格式扩展名。

    +
    +

    知识库导出 +知识库导出

    +

    2.5 导入知识库

    +
    +

    导入知识库时,需先创建一个通用知识库,点击【上传文档】,选择【QA 问答对】,上传知识库导出的文档,点击【开始导入】。

    +
    +

    知识库导出

    +

    2.6 删除知识库

    +
    +

    在知识库列表,点击知识库面板的【删除】对知识库进行删除操作。

    +

    注意:知识库删除后无法恢复,请谨慎操作。

    +
    +

    知识库删除

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/dataset/doclist/index.html b/v2/user_manual/dataset/doclist/index.html new file mode 100644 index 00000000..856f1862 --- /dev/null +++ b/v2/user_manual/dataset/doclist/index.html @@ -0,0 +1,3256 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 文档 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + +

    文档

    +
    +

    MaxKB 知识库文档支持同步、重新向量化、生成问题、转移、设置、导出以及删除操作。

    +
    +

    上传文档

    +

    1 文档上传

    +
    +

    对于通用型知识库,点击【上传文档】进入上传文档页面,可以拖拽文件或选择文件/文件夹进行上传。 +支持的文件格式包括:TXT、Markdown、PDF、DOCX、HTML、XLS、XLSX、CSV、ZIP。如果选择文件夹,将通过文件后缀进行自动过滤,每次最多上传 50 个文件,且单个文件不超过 100 MB。

    +
    +

    上传文档

    +
    +

    对于 Web 站点知识库,点击【导入文档】打开对话框,输入文档链接 URL 地址和选择器,即可同步对应内容。

    +
    +

    导入Web文档

    +

    2 文档同步

    +
    +

    Web 站点知识库支持对选中文档进行同步操作。同步时会先删除当前文档下的所有分段,并重新获取文档地址的文本数据后重新分段。

    +
    +

    同步文档

    +

    3 设置

    +
    +

    命中处理方式:

    +
      +
    • 模型优化:提问时命中该文档下面的分段后,会按照应用的提示词生成 prompt 发送给模型优化后返回答案。
    • +
    • 直接回答:提问时命中该文档下面的分段后,若相似度符合设置则直接返回分段内容。对于需要将图片、链接等信息返回要求,建议使用此方式。
    • +
    +
    +
    +

    允许在知识库来源中下载: 通用知识库和飞书知识库的文档支持选择是否【允许在知识来源中下载】的设置功能,勾选后,包含该知识库文档的应用,回答内容将不支持下载知识来源。

    +
    +

    文档设置

    +

    4 生成问题

    +
    +

    选中文档,点击【生成问题】按钮或执行生成问题操作,将通过 AI 模型(支持设置模型参数),根据文件内容总结生成对应的问题,并自动关联。

    +
    +

    生成问题

    +

    生成问题

    +

    5 文档迁移

    +
    +

    选中文档,点击【迁移】按钮,将文档迁移到其它知识库。

    +
    +

    迁移文档

    +

    6 导出 Excel/ZIP

    +
    +

    选中文档,执行导出 Excel/导出 Zip 操作,将文档下载到本地客户端。

    +
    +

    文档导出

    +

    7 下载原文档

    +
    +

    选中文档,点击【下载原文档】,可以将原文档下载到本地,保留原始文件。

    +

    注意:下载原文档功能仅允许手动在【上传文档】中上传的文件,否则会出现报错:文件不存在,仅支持手动上传的文档

    +
    +

    文档下载原文件

    +

    8 文档删除

    +
    +

    选中文档,点击删除按钮或执行删除操作,对选中文档进行删除。

    +
    +

    文档删除

    +

    9 文档启用与禁用

    +
    +

    在文档列表中的其中状态列,可对文档执行启用或禁用操作。文档禁用后,当用户提问时系统不会检索该文档下的分段内容,需要重新启用后系统才会检索。

    +
    +

    文档启用

    +

    10 分段管理

    +
    +

    导入文档后,系统根据分段规则进行分段操作。点击文档列表中的文档,进入文档分段管理页面,可添加、编辑、迁移、删除、启用/禁用分段以及为分段添加关联问题。

    +
    +

    分段管理

    +

    10.1 添加分段

    +
    +

    点击【添加】,弹出添加分段对话框,填写分段标题、分段内容(支持 Markdown 样式编辑分段内容)和关联问题,点击【提交】后则新增一个分段。
    +建议: 为了能准确匹配到分段,建议为分段设置关联问题,这样会优先匹配关联问题,然后再映射分段内容,从而提高匹配效率和准确度。

    +
    +

    添加分段

    +

    10.2 编辑分段

    +
    +

    点击分段面板,在分段详情页面对已分段的信息进行编辑和关联问题操作。

    +
    +

    分段详情

    +

    分段详情

    +

    10.3 迁移分段

    +
    +

    在分段面板中可以对选中分段迁移到其它知识库的文档中。

    +
    +

    迁移分段

    +

    10.4 删除分段

    +
    +

    在分段面板中可以对选中分段进行删除。

    +
    +

    删除分段

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/dataset/hit-testing/index.html b/v2/user_manual/dataset/hit-testing/index.html new file mode 100644 index 00000000..658b455a --- /dev/null +++ b/v2/user_manual/dataset/hit-testing/index.html @@ -0,0 +1,2880 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 命中测试 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    命中测试

    +
    +

    知识库命中测试是对提问进行提前验证,点击【命中测试】,输入测试问题,系统在当前知识库中向量检索与问题相关的分段,然后按照相似度和返回 Top 分段数等参数返回命中结果,可以根据命中测试返回分段内容,对分段进行再次编辑或添加关联问题,以进一步提升和优化回答效果。

    +
    +

    命中测试

    +
    +

    参数设置说明

    +
      +
    • 检索模式:当前支持向量检索、全文检索和混合检索 3 种检索模式。
        +
      • 向量检索:使用向量模型通过向量距离计算与用户问题最相似的文本分段。
      • +
      • 全文检索:通过关键词检索,返回包含关键词最多的文本分段。
      • +
      • 混合检索:同时执行全文检索和向量检索,再进行重排序,从两类查询结果中选择匹配用户问题的最佳结果。
      • +
      +
    • +
    • 相似度:相似度越高代表问题和分段的相关性越强。
    • +
    • 返回分段数 TOP : 返回符合条件的 Top N 个分段。
    • +
    +
    +

    命中测试

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/dataset/problem/index.html b/v2/user_manual/dataset/problem/index.html new file mode 100644 index 00000000..23af6f62 --- /dev/null +++ b/v2/user_manual/dataset/problem/index.html @@ -0,0 +1,2975 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 问题 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    问题

    +
    +

    MaxKB 知识库管理权限用户可以收集用户可能提出的相关问题,创建问题并关联知识库文档中的内容,维护知识库常见问题列表,以提高问答的准确度。

    +
    +

    问题列表

    +

    1 创建问题

    +
    +

    点击【创建问题】,分行输入问题列表。

    +
    +

    创建问题

    +

    2 问题关联分段

    +
    +

    问题添加完成后,可以与文档中的分段进行关联,当用户提问时会优先匹配问题库来查询相关的分段。

    +
    +

    问题关联分段

    +

    3 问题详情

    +
    +

    点击问题查看详情,可对分段内容进行修改或取消关联关系。

    +
    +

    问题详情

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/email/index.html b/v2/user_manual/email/index.html new file mode 100644 index 00000000..c8ba3687 --- /dev/null +++ b/v2/user_manual/email/index.html @@ -0,0 +1,2864 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 系统设置 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    邮箱设置

    +
    +

    支持系统管理员配置邮件服务器的相关信息,以便系统可以通过电子邮件进行通知或其他邮件相关的操作。

    +
    +

    用户列表

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/model/Regolo_model/index.html b/v2/user_manual/model/Regolo_model/index.html new file mode 100644 index 00000000..13f34a96 --- /dev/null +++ b/v2/user_manual/model/Regolo_model/index.html @@ -0,0 +1,2951 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 对接Regolo - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    对接Regolo

    + +

    1 添加模型

    +
    +

    添加 Regolo 大模型之前,需要先在 Regolo AI 创建 API Key。

    +

    选择模型供应商为Regolo,并在模型添加对话框中输入如下必要信息:

    +
      +
    • 模型名称:MaxKB 中自定义的模型名称。
    • +
    • 模型类型:大语言模型/向量模型/图片生成。
    • +
    • 基础模型:不同类型模型下的基础模型名称,下拉选项是常用的一些基础模型名称,支持自定义输入。
    • +
    • API Key:获取 API Key。
    • +
    +
    +

    2 配置样例

    +
    +

    Regolo-大语言模型配置样例图示:

    +
    +

    Regolo 大语言模型

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/model/X-Infer_model/index.html b/v2/user_manual/model/X-Infer_model/index.html new file mode 100644 index 00000000..67417e7d --- /dev/null +++ b/v2/user_manual/model/X-Infer_model/index.html @@ -0,0 +1,2978 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 对接Xorbits Inference - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    对接Xorbits Inference

    + +

    1 添加模型

    +
    +

    选择模型供应商为Xorbits Inference,并在模型添加对话框中输入如下必要信息:

    +
      +
    • 模型名称:MaxKB 中自定义的模型名称。
    • +
    • 模型类型:大语言模型/向量模型/重排模型/语音识别/语音合成/视觉模型/图片生成。
    • +
    • 基础模型:不同类型模型下的基础模型名称,下拉选项是常用的一些基础模型名称,支持自定义输入。
    • +
    +

    大语言模型和重排模型需要输入 API 域名和 API Key,向量模型需要输入 API 域名。

    +
      +
    • API 域名:Xorbits Inference 服务地址,例如:http://192.168.20.242:9997
    • +
    • API Key:若没有 API Key,输入任意字符即可。
    • +
    +
    +

    2 配置样例

    +
    +

    Xorbits Inference-大语言模型配置样例图示如下:

    +
    +

    Xorbits Inference

    +
    +

    Xorbits Inference-向量模型配置样例图示如下:

    +
    +

    Xorbits Inference

    +
    +

    Xorbits Inference-重排模型配置样例图示如下:

    +
    +

    Xorbits Inference

    +
    +

    Xorbits Inference-语音识别模型配置样例图示如下:

    +
    +

    Xorbits Inference

    +
    +

    Xorbits Inference-语音合成模型配置样例图示如下:

    +
    +

    Xorbits Inference

    +
    +

    Xorbits Inference-视觉模型配置样例图示如下:

    +
    +

    Xorbits Inference

    +
    +

    Xorbits Inference-图片生成模型配置样例图示如下:

    +
    +

    Xorbits Inference

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/model/amazon_bedrock_model/index.html b/v2/user_manual/model/amazon_bedrock_model/index.html new file mode 100644 index 00000000..1d5f04e7 --- /dev/null +++ b/v2/user_manual/model/amazon_bedrock_model/index.html @@ -0,0 +1,2952 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 对接Amazon Bedrock - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    对接Amazon Bedrock

    + +

    1 添加模型

    +
    +

    选择模型供应商为Amazon Bedrock,并在模型添加对话框中输入如下必要信息:

    +
      +
    • 模型名称:MaxKB 中自定义的模型名称。
    • +
    • 权限:分为私有和公用两种权限,私有模型仅当前用户可用,公用模型即系统内所有用户均可使用,但其它用户不能编辑和删除。
    • +
    • 模型类型:大语言模型/向量大模型。
    • +
    • 基础模型:Amazon Bedrock 支持的 LLM 模型名称,下拉选项是常用的一些大语言模型名称,支持自定义输入。
    • +
    • Region Name:模型开通的区域。
    • +
    • Access Key ID/Secret Access Key: Access Key ID 和 Secret Access Key 是用于对 AWS 服务(包括 Amazon Bedrock)的编程访问进行身份验证的凭证。
    • +
    +
    +

    2 配置样例

    +
    +

    Amazon Bedrock-大语言模型配置样例图示:

    +
    +

    AWS LLM模型

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/model/anthropic_model/index.html b/v2/user_manual/model/anthropic_model/index.html new file mode 100644 index 00000000..1ff5fc98 --- /dev/null +++ b/v2/user_manual/model/anthropic_model/index.html @@ -0,0 +1,2952 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 对接Anthropic - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    对接Anthropic

    + +

    1 添加模型

    +
    +

    添加 Anthropic 模型之前,需要注册并在控制台中的【账户管理-API 密钥】中创建 API Key。

    +

    选择模型供应商为Anthropic,并在模型添加对话框中输入如下必要信息:

    +
      +
    • 模型名称:MaxKB 中自定义的模型名称。
    • +
    • 模型类型:大语言模型/视觉模型。
    • +
    • 基础模型:Anthropic 支持的各类模型的基础模型名称,选项中显示了 Anthropic 支持的部分常用大语言模型名称,支持手动输入需要与 Anthropic 支持的模型名称保持一致,否则无法通过校验。
    • +
    • API URL:https://api.anthropic.com/v1/messages
    • +
    • API Key:在 anthropic 控制台创建的 API Key。
    • +
    +
    +

    2 配置样例

    +
    +

    Anthropic-大语言模型配置样例图示如下:

    +
    +

    anthropic

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/model/azure_openai_model/index.html b/v2/user_manual/model/azure_openai_model/index.html new file mode 100644 index 00000000..7e98c6a1 --- /dev/null +++ b/v2/user_manual/model/azure_openai_model/index.html @@ -0,0 +1,2956 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 对接Azure OpenAI - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    对接Azure OpenAI

    + +

    1 添加模型

    +
    +

    添加 Azure OpenAI 大模型之前,需要先在 Azure AI Studio 中注册,并获取有关 API 域名、API Key、部署详细信息等内容,参考下图:

    +

    选择模型供应商为Azure OpenAI,并在模型添加对话框中输入如下必要信息:

    +
      +
    • 模型名称:MaxKB 中自定义的模型名称。
    • +
    • 模型类型:大语言模型/向量模型/语音识别/语音合成/视觉模型/图片生成。
    • +
    • 基础模型:具体的基础模型由部署名决定,见上图。
    • +
    • API 版本:模型版本
    • +
    • API 域名:Azure OpenAI 项目 API 服务 URL,见上图。
    • +
    • API Key:Azure OpenAI 项目 API 服务认证验证信息,见上图。
    • +
    • 部署名:Azure AI Studio 项目操场中模型的部署名称。
    • +
    +
    +

    Azure OpenAI Key +Azure OpenAI DemployInfo

    +

    2 配置样例

    +
    +

    Azure OpenAI-大语言模型配置样例图示:

    +
    +

    Azure_大语言模型

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/model/bailian_model/index.html b/v2/user_manual/model/bailian_model/index.html new file mode 100644 index 00000000..abb044de --- /dev/null +++ b/v2/user_manual/model/bailian_model/index.html @@ -0,0 +1,2991 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 对接阿里云百炼 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    对接阿里云百炼

    + +

    1 添加模型

    +
    +

    选择模型供应商为阿里云百炼,并在模型添加对话框中输入如下必要信息:

    +
      +
    • 模型名称:MaxKB 中自定义的模型名称。
    • +
    • 模型类型:大语言模型/向量模型/重排模型/语音识别/语音合成/视觉模型/图片生成/文生视频/图生视频。
    • +
    • 基础模型:不同类型模型下的基础模型名称,下拉选项是常用的一些基础模型名称,支持自定义输入。
    • +
    • API 域名:模型服务 API 服务访问地址,目前当模型类型是大语言模型时需要输入。
    • +
    • API Key:模型服务 API 服务访问密钥。
    • +
    +

    注意:不同的大语言模型对应的 API 域名不一样,具体请查看对应基础模型的 API 调用示例。

    +
    +

    阿里云百炼 APIKEY

    +

    阿里云百炼 APIKEY

    +

    阿里云百炼

    +

    2 配置样例

    +
    +

    阿里云百炼-大语言模型配置样例图示如下。

    +
    +

    阿里云百炼 大语言模型配置

    +
    +

    阿里云百炼-向量模型配置样例图示如下:

    +
    +

    阿里云百炼 向量模型配置

    +
    +

    阿里云百炼-重排模型配置样例图示如下:

    +
    +

    阿里云百炼 重排模型配置

    +
    +

    阿里云百炼语音识别模型除了支持 ASR、Paraformer模型外,还支持 qwen-omni-turbo、qwen2.5-omni-7b 全模态模型。

    +

    阿里云百炼-语音识别模型配置样例图示如下:

    +
    +

    阿里云百炼 语音识别模型配置

    +
    +

    阿里云百炼-语音合成模型配置样例图示如下:

    +
    +

    阿里云百炼 语音合成模型配置

    +
    +

    阿里云百炼-视觉模型模型配置样例图示如下:

    +
    +

    阿里云百炼 视觉模型模型配置

    +
    +

    阿里云百炼-图片生成模型默认图像尺寸为 1024 * 1024,图片数量 1 张,风格为 <auto>,即由模型随机输出图像风格,配置样例图示如下:

    +
    +

    阿里云百炼 图片生成模型配置

    +

    阿里云百炼 图片生成模型配置

    +
    +

    阿里云百炼-文生视频模型配置样例图示如下:

    +
    +

    阿里云百炼 文生视频模型配置

    +

    阿里云百炼 文生视频模型配置

    +
    +

    阿里云百炼-图生视频模型配置样例图示如下:

    +
    +

    阿里云百炼 图生视频模型配置

    +

    阿里云百炼 图生视频模型配置

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/model/deepseek_model/index.html b/v2/user_manual/model/deepseek_model/index.html new file mode 100644 index 00000000..113df4ac --- /dev/null +++ b/v2/user_manual/model/deepseek_model/index.html @@ -0,0 +1,2952 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 对接DeepSeek - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    对接DeepSeek

    + +

    1 添加模型

    +
    +

    添加 DeepSeek 大模型之前,需要先在 DeepSeek 开放平台 创建 API Key。

    +

    选择模型供应商为DeepSeek,并在模型添加对话框中输入如下必要信息:

    +
      +
    • 模型名称:MaxKB 中自定义的模型名称。
    • +
    • 模型类型:大语言模型。
    • +
    • 基础模型:不同类型模型下的基础模型名称,下拉选项是常用的一些基础模型名称,支持自定义输入。
    • +
    • API Key:在 DeepSeek 开放平台创建并查看。
    • +
    +
    +

    kimi 模型

    +

    2 配置样例

    +
    +

    DeepSeek-大语言模型配置样例图示:

    +
    +

    deepseek 模型

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/model/doubao_model/index.html b/v2/user_manual/model/doubao_model/index.html new file mode 100644 index 00000000..ed6ecc8b --- /dev/null +++ b/v2/user_manual/model/doubao_model/index.html @@ -0,0 +1,2994 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 对接火山引擎 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    对接火山引擎

    + +

    1 添加模型

    +
    +

    选择模型供应商为火山引擎,并在模型添加对话框中输入如下必要信息:

    +
      +
    • 模型名称:MaxKB 中自定义的模型名称。
    • +
    • 模型类型:大语言模型/向量模型/语音识别/语音合成/视觉模型/图片生成/文生视频/图生视频。
    • +
    +

    豆包大语言模型其它接入参数说明:

    +
      +
    • 基础模型:在线推理的接入点ID。
    • +
    • API 域名:https://ark.cn-beijing.volces.com/api/v3
    • +
    • API Key:接入点-> API调用 -> 通过API Key授权 -> 选择 API Key 复制获取,如下图
    • +
    +

    语音识别和语音合成需要输入 App ID、Access Token、Cluster ID:

    +
      +
    • App 域名:语音识别模型 API 域名为wss://openspeech.bytedance.com/api/v2/asr,语音合成模型 API 域名为wss://openspeech.bytedance.com/api/v1/tts/ws_binary
    • +
    • App ID:在火山引擎中创建的应用 ID。
    • +
    • Access Token:在火山引擎应用对应的认证信息。
    • +
    • Cluster ID:在火山引擎应用对应的服务信息.
    • +
    +
    +

    火山引擎 LLM模型

    +

    火山引擎 LLM模型

    +

    2 配置样例

    +
    +

    火山引擎-大语言模型配置样例图示如下:

    +
    +

    火山引擎 LLM模型

    +
    +

    火山引擎-向量模型配置样例图示如下:

    +
    +

    火山引擎 向量模型

    +
    +

    火山引擎-语音识别模型配置样例图示如下:

    +
    +

    火山引擎 语音识别模型

    +
    +

    火山引擎-语音合成模型配置样例图示如下:

    +
    +

    火山引擎 语音合成模型

    +
    +

    火山引擎-视觉模型模型配置样例图示如下:

    +
    +

    火山引擎 视觉模型

    +
    +

    火山引擎-图片生成模型需要在火山引擎【控制台-访问控制-API 访问密钥】新建密钥,样例图示如下:

    +
    +

    火山引擎 图片生成

    +

    火山引擎 图片生成

    +
    +

    火山引擎-文生视频模型模型配置样例图示如下:

    +
    +

    火山引擎 文生视频

    +

    火山引擎 文生视频

    +
    +

    火山引擎-图生视频模型模型配置样例图示如下:

    +
    +

    火山引擎 图生视频

    +

    火山引擎 图生视频

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/model/gemini_model/index.html b/v2/user_manual/model/gemini_model/index.html new file mode 100644 index 00000000..1a999c15 --- /dev/null +++ b/v2/user_manual/model/gemini_model/index.html @@ -0,0 +1,2953 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 对接Gemini - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    对接Gemini

    + +

    1 添加模型

    +
    +

    添加 Gemini 大模型之前,需要先在 Google AI Studio 创建 API Key。

    +

    选择模型供应商为Gemini,并在模型添加对话框中输入如下必要信息:

    +
      +
    • 模型名称:MaxKB 中自定义的模型名称。
    • +
    • 模型类型:大语言模型/向量模型/语音识别/视觉模型。
    • +
    • 基础模型:不同类型模型下的基础模型名称,下拉选项是常用的一些基础模型名称,支持自定义输入。
    • +
    • API Key:获取 API Key。
    • +
    +

    注意: 使用 Gemini API 需要确保程序所在服务器位于 Gemini API 所支持的地区 ,否则无法调用API,并且无法进入Google AI Studio。

    +
    +

    Gemini APIKEy

    +

    2 配置样例

    +
    +

    Gemini-大语言模型配置样例图示:

    +
    +

    gemini 大语言模型

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/model/hunyuan_model/index.html b/v2/user_manual/model/hunyuan_model/index.html new file mode 100644 index 00000000..23dfc587 --- /dev/null +++ b/v2/user_manual/model/hunyuan_model/index.html @@ -0,0 +1,2973 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 对接腾讯混元 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    对接腾讯混元

    + +

    1 添加模型

    +
    +

    添加腾讯混元大模型之前,需要先在腾讯云开通腾讯混元服务并新建秘钥。

    +

    选择模型供应商为腾讯混元,并在模型添加对话框中输入如下必要信息:

    +
      +
    • 模型名称:MaxKB 中自定义的模型名称。
    • +
    • 模型类型:大语言模型/向量模型/语音识别/视觉模型/图片生成。
    • +
    • 基础模型:不同类型模型下的基础模型名称,下拉选项是常用的一些基础模型名称,支持自定义输入。
    • +
    • APPID:【腾讯云-控制台-访问管理-API 密钥管理】中获取。
    • +
    • SecretId:【腾讯云-控制台-访问管理-API 密钥管理】中获取。
    • +
    • SecretKey:【腾讯云-控制台-访问管理-API 密钥管理】新建密钥时下载的 SecretKey。
    • +
    +
    +

    tencent apikey

    +

    tencent apikey

    +
    +

    2 配置样例

    +
    +

    腾讯混元-大语言模型配置样例图示如下:

    +
    +

    hunyuan 大语言模型

    +
    +

    腾讯混元-向量模型配置样例图示如下:

    +
    +

    hunyuan 向量模型

    +
    +

    腾讯混元-语音识别配置样例图示如下:

    +
    +

    hunyuan 向量模型

    +
    +

    腾讯混元-视觉模型模型配置样例图示如下:

    +
    +

    hunyuan 视觉模型模型

    +
    +

    腾讯混元-图片生成模型默认图像尺寸为 768 * 768,图片数量 1 张,风格为201,即日系动漫风格,默认配置样例图示如下:

    +
    +

    hunyuan 图片生成模型

    +

    hunyuan 图片生成模型

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/model/kimi_model/index.html b/v2/user_manual/model/kimi_model/index.html new file mode 100644 index 00000000..4c5b5f10 --- /dev/null +++ b/v2/user_manual/model/kimi_model/index.html @@ -0,0 +1,2953 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 对接Kimi - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    对接Kimi

    + +

    1 添加模型

    +
    +

    添加 Kimi 模型之前,需要先在 Moonshot AI 开放平台 中注册并创建 API Key。

    +

    选择模型供应商为Kimi,并在模型添加对话框中输入如下必要信息:

    +
      +
    • 模型名称:MaxKB 中自定义的模型名称。
    • +
    • 模型类型:大语言模型。
    • +
    • 基础模型:不同类型模型下的基础模型名称,下拉选项是常用的一些基础模型名称,支持自定义输入。。
    • +
    • API 域名:https://api.moonshot.cn/v1
    • +
    • API Key:在 Kimi 账户中心的 API Key 管理中创建和查看。
    • +
    +
    +

    kimi APIkey

    +

    2 配置样例

    +
    +

    kimi-大语言模型配置样例图示:

    +
    +

    kimi 模型

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/model/local_model/index.html b/v2/user_manual/model/local_model/index.html new file mode 100644 index 00000000..e8d5176b --- /dev/null +++ b/v2/user_manual/model/local_model/index.html @@ -0,0 +1,2983 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 对接本地大模型 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    对接本地大模型

    + +

    1 下载模型

    +
    +

    前提条件: 将模型下载到服务器,并且挂在到 MaxKB 容器中,以向量模型为例详细说明如下。

    +
      +
    • 将向量模型下载到本地服务器。 +
      # 推荐模型下载网址
      +https://huggingface.co/models?other=text-embedding
      +# 下载后存放在/opt/maxkb/model/local_embedding目录下
      +
    • +
    • 使用-v 将宿主机模型路径挂载到 MaxKB 容器内部。 +
      -v /opt/maxkb/model/local_embedding:/opt/maxkb/model/local_embedding
      +# 说明: v 模型所在目录:MaxKB 容器内目录
      +
    • +
    +
    +

    2 添加模型

    +
    +

    在模型管理中,点击供应商【本地模型】,直接进入下一步填写本地模型的表单。

    +
      +
    • 模型名称:MaxKB 中自定义的模型名称。
    • +
    • 模型类型:向量模型/重排模型。
    • +
    • 基础模型:模型在 MaxKB 容器下的绝对路径。
    • +
    • 模型目录:模型的目录(基础模型为名称时,该目录生效,基础模型若有绝对路径,则该参数不生效,建议与基础模型填写一致)。
    • +
    +
    +

    3 配置样例

    +
    +

    本地模型-向量模型配置样例图示如下:

    +
    +

    本地向量模型

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/model/model_param/index.html b/v2/user_manual/model/model_param/index.html new file mode 100644 index 00000000..653ba640 --- /dev/null +++ b/v2/user_manual/model/model_param/index.html @@ -0,0 +1,2868 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 模型参数配置 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    模型参数配置

    + +
    +

    点击模型右上角更多菜单,点击【模型参数设置】,可以根据各平台提供的其它参数进行配置。

    +
    +

    模型参数设置 +添加模型参数

    +
    +

    以模型联网搜索参数为例,首先需要先在对应模型平台官方 API 文档找到模型的参数信息,例如百度千帆大模型的 ERNIE-4.0-8K, 联网参数为:disable_search,打开 ERNIE-4.0-8K的模型参数设置,添加关闭实时搜索参数。 +注意: 不同模型该参数会有差异,请根据官方文档进行配置相关参数。

    +
    +

    千帆_实时搜索

    +
    +

    然后在应用的 AI 模型参数设置中,设置实时搜索功能参数。

    +
    +

    模型参数_实时搜索

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/model/model_summary/index.html b/v2/user_manual/model/model_summary/index.html new file mode 100644 index 00000000..1a93303e --- /dev/null +++ b/v2/user_manual/model/model_summary/index.html @@ -0,0 +1,3234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 模型概述 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    模型概述

    +

    1 功能概述

    +
    +

    MaxKB 支持与多种供应商模型的集成,支持对接当前主流的大型模型。这包括但不限于本地部署的私有模型如 Llama 3 和 Qwen 2,国内提供的公共模型服务例如 DeepSeek、SILICONFLOW、Kimi、智谱 AI 和百度千帆,以及国际知名的公共模型服务如 OpenAI、Azure OpenAI、Anthropic 和 Gemini。集成的模型类型广泛,涵盖文本生成、向量分析、排序算法、语音识别、语音合成、计算机视觉模型以及图像生成等,满足多样化的业务需求和应用场景。

    +

    【模型】用来管理各类大型模型,为后续知识库和应用提供模型使用;

    +
      +
    • 共享模型:系统管理员在【共享资源】中创建共享模型后,可以授权给指定工作空间。
    • +
    • 全部模型:用户可以创建模型,其他用户资源授权后可以查看、使用和维护。
    • +
    +

    注意:共享资源为企业版 X-Pack 功能。

    +
    +

    模型

    +

    2 模型管理

    +
    +

    左侧选择全部模型后,选择对应供应商,【添加模型】进行模型添加。

    +
    +

    模型

    +
    +

    支持编辑、模型参数设置和删除。

    +
    +

    模型

    +
    +

    支持按模型名称、模型类型、创建者查询。

    +
    +

    模型

    +
    +

    模型删除需要二次确认,确认后将直接删除模型。

    +
    +

    模型

    +

    3 支持的供应商及模型

    +
    +

    各供应商支持的类型详情见下表(按字母排序):

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    大语言模型向量模型重排模型语音识别语音合成视觉模型图片生成文生视频图生视频
    阿里云百炼
    Anthropic
    Amazon Bedrock
    Azure OpenAI
    DeepSeek
    Gemini
    kimi
    OpenAI
    SILICONFLOW
    腾讯云
    腾讯混元
    火山引擎
    千帆大模型
    讯飞星火
    智谱 AI
    本地模型
    Ollama
    vLLM
    Xorbits Inference
    +
    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/model/ollama_model/index.html b/v2/user_manual/model/ollama_model/index.html new file mode 100644 index 00000000..1ad440a4 --- /dev/null +++ b/v2/user_manual/model/ollama_model/index.html @@ -0,0 +1,2971 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 对接Ollama - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    对接Ollama

    + +

    1 添加模型

    +
    +

    说明: Ollama 允许用户在本地计算机上运行和部署大型语言模型。在添加 Ollama 模型之前需要先自行安装部署 Ollama 并运行模型。

    +

    可详参考:Ollama 离线部署LLM模型

    +
    +
    +

    模型供应商为Ollama,并在模型添加对话框中输入如下必要信息:

    +
      +
    • 模型名称:MaxKB 中自定义的模型名称。
    • +
    • 模型类型:大语言模型/向量模型/视觉模型/重排模型。
    • +
    • 基础模型:不同类型模型下的基础模型名称,下拉选项是常用的一些基础模型名称,支持自定义输入,但需要与 Ollama 支持的模型名称保持一致,否则无法通过校验。如果本地没有此模型,系统将自动下载。
    • +
    +

    大语言模型还需要输入 API 域名和API Key,向量模型需要输入API 域名。

    +
      +
    • API 域名:为 Ollama 服务地址连接信息,例如:http://42.92.198.53:11434
    • +
    • API Key:若没有配置API Key,可以输入任意字符。
    • +
    +

    点击【添加】,校验通过则添加成功,便可以在应用的 AI 模型列表选择该模型。

    +
    +

    2 配置样例

    +
    +

    ollama-大语言模型配置样例图示:

    +
    +

    ollama 大语言模型

    +
    +

    ollama-向量模型配置样例图示:

    +
    +

    ollama 向量模型

    +
    +

    ollama-视觉模型配置样例图示:

    +
    +

    ollama 视觉模型模型

    +
    +

    ollama-重排模型配置样例图示:

    +
    +

    ollama 重排模型模型

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/model/openai_model/index.html b/v2/user_manual/model/openai_model/index.html new file mode 100644 index 00000000..eb6ff08a --- /dev/null +++ b/v2/user_manual/model/openai_model/index.html @@ -0,0 +1,2972 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 对接OpenAI - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    对接OpenAI

    + +

    1 添加模型

    +
    +

    选择模型供应商为OpenAI,并在模型添加对话框中输入如下必要信息:

    +
      +
    • 模型名称: MaxKB 中自定义的模型名称。
    • +
    • 模型类型: 大语言模型/向量模型/语音识别/语音合成/视觉模型/图片生成。
    • +
    • 基础模型: 不同类型模型下的基础模型名称,下拉选项是常用的一些基础模型名称,支持自定义输入,但需要与 OpenAI 支持的模型名称保持一致,否则无法通过校验。
    • +
    • API 域名:国外 Open API 的域名是https://api.openai.com/v1,国内代理的 API 域名格式一般是反向代理地址/v1
    • +
    • API Key:访问 OpenAI 的 Key。
    • +
    +
    +

    OpenAI 模型

    +

    2 配置样例

    +
    +

    OpenAI-大语言模型配置样例图示:

    +
    +

    OpenAI 模型

    +
    +

    OpenAI-向量模型配置样例图示:

    +
    +

    OpenAI 模型

    +
    +

    OpenAI-语音识别模型配置样例图示:

    +
    +

    OpenAI 模型

    +
    +

    OpenAI-语音合成配置样例图示:

    +
    +

    OpenAI 模型

    +
    +

    OpenAI-视觉模型配置样例图示:

    +
    +

    OpenAI 模型

    +
    +

    OpenAI-图片生成模型配置样例图示:

    +
    +

    OpenAI 模型

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/model/qianfan_model/index.html b/v2/user_manual/model/qianfan_model/index.html new file mode 100644 index 00000000..43f5310c --- /dev/null +++ b/v2/user_manual/model/qianfan_model/index.html @@ -0,0 +1,2959 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 对接百度千帆 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    对接百度千帆

    + +

    1 添加模型

    +
    +

    添加千帆大模型之前,需要先在 百度智能云千帆大模型平台 中进行注册并登录。在控制台中的【安全认证】中创建 API Key 和 Secret Key 等信息。

    +

    说明: 千帆 ModelBuilder 已经推出兼容 OpenAI 规范的 v2 版本推理接口,v1 版本推理接口即将下线。MaxKB 对 v1和 v2 版本接口进行了兼容处理,在创建模型时,可以指定 API 接口版本。使用 v1 版本时,需要输入 API Key 和 Secret Key 参数,而 v2 版本版本输入参数为 API URL 和 API Key。

    +

    选择模型供应商为千帆大模型,并在模型添加对话框中输入如下必要信息:

    +
      +
    • 模型名称:MaxKB 中自定义的模型名称。
    • +
    • 模型类型:大语言模型/向量模型。
    • +
    • 基础模型:百度千帆支持的 LLM 模型名称,选项中显示了百度千帆支持的部分常用大语言模型名称,支持手动输入,但需要与千帆大平台支持的模型名称保持一致,否则无法通过校验。
    • +
    • API Version: API 接口版本,v1/v2。
    • +
    • API URL: API Version 为 v2时的输入参数,请输入https://qianfan.baidubce.com/v2
    • +
    • API Key 和 Secret Key: API Version 为 v1 时的输入参数, 即千帆大模型中应用的 API Key 和 Secret Key。
    • +
    +
    +

    百度应用

    +

    2 配置样例

    +
    +

    千帆大模型 v2-大语言模型配置样例图示:

    +
    +

    千帆大模型

    +
    +

    千帆大模型 v2-向量模型配置样例图示:

    +
    +

    千帆大模型

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/model/siliconflow_model/index.html b/v2/user_manual/model/siliconflow_model/index.html new file mode 100644 index 00000000..d234ded9 --- /dev/null +++ b/v2/user_manual/model/siliconflow_model/index.html @@ -0,0 +1,2974 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 对接SILICONFLOW - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    对接SILICONFLOW

    + +

    1 添加模型

    +
    +

    添加 SILICONFLOW 模型之前,需要先在 SILICONFLOW 中进行注册并登录。在控制台中的【账户管理-API密钥】中新建 API 密钥。

    +

    选择模型供应商为SILICONFLOW,并在模型添加对话框中输入如下必要信息:

    +
      +
    • 模型名称:MaxKB 中自定义的模型名称。
    • +
    • 模型类型:大语言模型/向量模型/语音识别/语音合成/图片生成/重排模型。
    • +
    • 基础模型:SILICONFLOW 支持的各类模型的基础模型名称,选项中显示了 SILICONFLOW 支持的部分常用大语言模型名称,支持手动输入,但需要与 SILICONFLOW 支持的模型名称保持一致,否则无法通过校验。
    • +
    • API URL:https://api.siliconflow.cn/v1
    • +
    • API Key:创建的密钥 Key。
    • +
    +
    +

    SILICONFLOW

    +

    SILICONFLOW

    +

    2 配置样例

    +
    +

    SILICONFLOW-大语言模型配置样例图示如下:

    +
    +

    SILICONFLOW

    +
    +

    SILICONFLOW-向量模型配置样例图示如下:

    +
    +

    SILICONFLOW

    +
    +

    SILICONFLOW-语音识别配置样例图示如下:

    +
    +

    SILICONFLOW

    +
    +

    SILICONFLOW-语音合成配置样例图示如下:

    +
    +

    SILICONFLOW

    +
    +

    SILICONFLOW-图片生成配置样例图示如下:

    +
    +

    SILICONFLOW

    +
    +

    SILICONFLOW-重排模型配置样例图示如下:

    +
    +

    SILICONFLOW

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/model/spark_model/index.html b/v2/user_manual/model/spark_model/index.html new file mode 100644 index 00000000..06c445ad --- /dev/null +++ b/v2/user_manual/model/spark_model/index.html @@ -0,0 +1,2967 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 对接讯飞星火 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    对接讯飞星火

    + +

    1 添加模型

    +
    +

    添加讯飞星火大模型之前,需要先在 讯飞开放平台 中进行注册,并根据不同的模型类型创建不同应用,平台将自动生成APPID、API Secret、APIKey等信息。

    +

    选择模型供应商为讯飞星火,并在模型添加对话框中输入如下必要信息:

    +
      +
    • 模型名称:MaxKB 中自定义的模型名称。
    • +
    • 模型类型:大语言模型/向量模型/语音识别/语音合成。
    • +
    • 基础模型:对应接口文档中的 domain,下拉选项是讯飞星火不同模型类型下的常用基础模型名称,支持自定义输入。
    • +
    • API 域名:每个基础模型对应的 API 域名不同,请根据所选基础模型输入对应的 API 域名,详情请参考讯飞开放平台文档中心
    • +
    • APP ID:讯飞开放平台中创建应用的标识。
    • +
    • API Key:讯飞开放平台应用访问对应的 API Key。
    • +
    • API Secret:讯飞开放平台应用访问对应的的 API Secret。
    • +
    +
    +

    讯飞APP

    +

    2 配置样例

    +
    +

    讯飞星火-大语言模型配置样例图示:

    +
    +

    讯飞模型

    +
    +

    讯飞星火-向量模型配置样例图示:

    +
    +

    讯飞模型

    +
    +

    讯飞星火-语音识别模型配置样例图示:

    +
    +

    讯飞模型

    +
    +

    讯飞星火-语音合成模型配置样例图示:

    +
    +

    讯飞模型

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/model/tencentcloud_model/index.html b/v2/user_manual/model/tencentcloud_model/index.html new file mode 100644 index 00000000..66d2eef4 --- /dev/null +++ b/v2/user_manual/model/tencentcloud_model/index.html @@ -0,0 +1,2954 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 对接腾讯云 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    对接腾讯云

    + +

    1 添加模型

    +
    +

    添加腾讯知识引擎原子能力之前,需要先在腾讯云开通知识引擎原子能力服务并新建API Key。

    +

    选择模型供应商为腾讯云,并在模型添加对话框中输入如下必要信息:

    +
      +
    • 模型名称:MaxKB 中自定义的模型名称。
    • +
    • 模型类型:大语言模型。
    • +
    • 基础模型:不同类型模型下的基础模型名称,下拉选项是常用的一些基础模型名称,支持自定义输入。
    • +
    • API URL:https://api.lkeap.cloud.tencent.com/v1/chat/completions
    • +
    • API Key:在控制台新建的OpenAI API KEY。
    • +
    +
    +

    tencent apikey

    +
    +

    2 配置样例

    +
    +

    腾讯云知识引擎原子能力-大语言模型配置样例图示如下:

    +
    +

    知识引擎原子 大语言模型

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/model/tongyi_model/index.html b/v2/user_manual/model/tongyi_model/index.html new file mode 100644 index 00000000..1036d516 --- /dev/null +++ b/v2/user_manual/model/tongyi_model/index.html @@ -0,0 +1,2898 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Tongyi model - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    Tongyi model

    + +

    1 添加模型

    +
    +

    添加通义千问模型之前,需要先在阿里云 DashScope 模型服务灵积的控制台中创建 API-Key。

    +
    +

    通义千问 APIkey

    +
    +

    选择模型供应商为通义千问,并在模型添加对话框中输入如下必要信息:

    +
      +
    • 模型名称:MaxKB 中自定义的模型名称。
    • +
    • 权限:分为私有和公用两种权限,私有模型仅当前用户可用,公用模型即系统内所有用户均可使用,但其它用户不能编辑和删除。
    • +
    • 模型类型:大语言模型/视觉模型/图片生成。
    • +
    • 基础模型:不同类型模型下支持的基础模型名称,下拉选项是常用的一些基础模型名称,支持自定义输入。
    • +
    • API Key:阿里云 DashScope灵积模型服务 API Key管理中创建和查看。
    • +
    +
    +

    2 配置样例

    +
    +

    通义千问-大语言模型配置样例图示如下:

    +
    +

    通义千问 大语言模型

    +
    +

    通义千问-视觉模型模型配置样例图示如下:

    +
    +

    通义千问 图片模型

    +
    +

    通义千问-图片生成模型默认图像尺寸为 1024 * 1024,图片数量 1 张,风格为 ,即由模型随机输出图像风格,配置样例图示如下:

    +
    +

    通义千问 图片模型

    +

    通义千问 图片模型

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/model/vllm_model/index.html b/v2/user_manual/model/vllm_model/index.html new file mode 100644 index 00000000..47f5b4fa --- /dev/null +++ b/v2/user_manual/model/vllm_model/index.html @@ -0,0 +1,2967 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 对接vLLM - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    对接vLLM

    + +

    1 添加模型

    +
    +

    选择模型供应商为vLLM,并在模型添加对话框中输入如下必要信息:

    +
      +
    • 模型名称:MaxKB 中自定义的模型名称。
    • +
    • 模型类型:大语言模型/向量模型/语音识别模型/视觉模型/重排模型。
    • +
    • 基础模型:不同类型模型下的基础模型名称,下拉选项是常用的一些基础模型名称,支持自定义输入。
    • +
    • API 域名:vLLM 服务地址, 如:http://192.168.20.242:8000/v1
    • +
    • API Key:若没有 API Key,输入任意字符即可。
    • +
    +
    +

    2 配置样例

    +
    +

    vLLM-大语言模型配置样例图示如下:

    +
    +

    vLLM LLM模型

    +
    +

    vLLM-向量模型配置样例图示如下:

    +
    +

    vLLM 向量模型

    +
    +

    vLLM-语音识别模型配置样例图示如下:

    +
    +

    vLLM 语音模型

    +
    +

    vLLM-视觉模型配置样例图示如下:

    +
    +

    vLLM 视觉模型

    +
    +

    vLLM-重排模型配置样例图示如下:

    +
    +

    vLLM 重排模型

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/model/zhipu_model/index.html b/v2/user_manual/model/zhipu_model/index.html new file mode 100644 index 00000000..1c1f3045 --- /dev/null +++ b/v2/user_manual/model/zhipu_model/index.html @@ -0,0 +1,2961 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 对接智谱AI - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    对接智谱AI

    + +

    1 添加模型

    +
    +

    添加讯智谱AI模型之前,需要先在 智谱AI开放平台 中进行注册并创建 API Key。

    +

    选择模型供应商为智谱AI,并在模型添加对话框中输入如下必要信息:

    +
      +
    • 模型名称:MaxKB 中自定义的模型名称。
    • +
    • 模型类型:大语言模型/视觉模型/图片生成。
    • +
    • 基础模型:不同类型模型下的基础模型名称,下拉选项是常用的一些基础模型名称,支持自定义输入。
    • +
    • API Key:在智谱 AI 开放平台创建的 API Key。
    • +
    +
    +

    智普APIkey

    +

    2 配置样例

    +
    +

    智谱AI-大语言模型配置样例图示如下:

    +
    +

    智普_大语言模型

    +
    +

    智谱AI-视觉模型模型配置样例图示如下:

    +
    +

    智普_视觉模型模型

    +
    +

    智谱AI-图片生成模型配置样例图示如下:

    +
    +

    智普_图片生成模型

    +

    智普_图片生成模型

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/team/team/index.html b/v2/user_manual/team/team/index.html new file mode 100644 index 00000000..4ab8b802 --- /dev/null +++ b/v2/user_manual/team/team/index.html @@ -0,0 +1,2905 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 团队管理 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    团队管理

    +
    +

    在 MaxKB 中,支持团队协同维护知识库和应用。内置所有者和成员两种角色,知识库/应用创建者即为所有者角色,添加的成员用户都是成员角色。所有者可以添加和移除成员。
    +友情提示:社区版限制 1 个团队成员。

    +
    +

    成员列表

    +

    1 添加成员

    +
    +

    点击【添加成员】,需要输入完整的成员用户名或邮箱后进行添加。
    +注意: 待添加的成员必须是已存在的用户。

    +
    +

    添加成员

    +

    2 权限设置

    +
    +

    添加成员后,可以对成员分配知识库和应用的的权限。

    +
      +
    • 管理权限,当成员登录 MaxKB 后可以管理操作相应资源。
    • +
    • 使用权限,当成员登录 MaxKB 后仅能查看相应资源。
    • +
    +

    点击【保存】后,权限设置生效。

    +
    +

    权限设置

    +

    3 移除成员

    +
    +

    在成员列表中点击【…】->【移除】即可删除该成员,成员移除后将失去所有权限。

    +
    +

    移除成员

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/tool/img.png b/v2/user_manual/tool/img.png new file mode 100644 index 00000000..fced974f Binary files /dev/null and b/v2/user_manual/tool/img.png differ diff --git a/v2/user_manual/tool/img_1.png b/v2/user_manual/tool/img_1.png new file mode 100644 index 00000000..e07e2bf8 Binary files /dev/null and b/v2/user_manual/tool/img_1.png differ diff --git a/v2/user_manual/tool/img_2.png b/v2/user_manual/tool/img_2.png new file mode 100644 index 00000000..eba84d08 Binary files /dev/null and b/v2/user_manual/tool/img_2.png differ diff --git a/v2/user_manual/tool/tool/index.html b/v2/user_manual/tool/tool/index.html new file mode 100644 index 00000000..845c3b07 --- /dev/null +++ b/v2/user_manual/tool/tool/index.html @@ -0,0 +1,3189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 工具 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + +

    工具

    +

    1 功能概述

    +
    +

    MaxKB 支持用户根据自身的业务需求,通过各种工具获取和查询数据、逻辑判断、信息提取或其它场景的操作并在应用编排时进行调用,以满足各种复杂的业务需求。

    +
      +
    • 共享工具:系统管理员在【共享资源】中创建共享工具后,可以授权给指定工作空间。
    • +
    • 全部工具:用户可以创建工具,其他用户资源授权后可以查看、使用和维护。
    • +
    +

    工具通过文件夹进行管理,根目录下可建立最多三级的子文件夹。每一级文件夹内均可创建相应的工具。用户可以创建工具,也可以使用资源授权后的工具。

    +

    注意:共享资源为企业版 X-Pack 功能。

    +
    +

    工具

    +

    2 自定义工具

    +

    2.1 依赖安装

    +
    +

    如果工具实现需要安装第三方依赖包,可在 MaxKB 容器中使用 pip 命令进行安装。

    +
    # 进入 MaxKB 容器中
    +docker exec -it maxkb bash
    +
    +# pip安装第三方依赖,如 pymysql,执行下面命令
    +pip install pymysql 
    +
    +
    +

    2.2 工具创建

    +
    +

    点击【创建工具】,打开创建工具页面。

    +
      +
    • 工具名称:工具的 logo 与工具名称,便于识别。工具 logo 在保存后可自定义上传。
    • +
    • 描述:工具详细说明以及使用注意事项,会显示在高级编排应用的组件列表中。
    • +
    • 启动参数:启用参数即工具运行的必要参数,例如 API Key 等。将启动参数与输入参数分离,在工作流中仅关注输入参数,同时也避免关键信息的泄露。
    • +
    • 输入参数:工具的输入参数,参数的数据类别包括:string、int、float、array,可自定义赋值,也可引用参数。
    • +
    • 函数内容:自定义编写 Python 工具代码,可以引用输入变量。
    • +
    • 输出参数:Python 代码执行返回的结果。
    • +
    +
    +

    创建函数

    +
    +

    Python 代码编写完成后,点击【调试】进行代码功能的验证。调试完成后,点击【创建】,即完成工具的创建。已创建成功的工具,默认状态为【已禁用】。

    +
    +

    工具调试

    +
    +

    已启用的工具,可以在【高级编排应用】的中,点击【添加组件】->【工具】中,以添加组件的方式调用工具;也可通过【AI 对话】组件的【工具】进行调用。

    +
    +

    添加工具节点

    +

    3 创建 MCP

    +
    +

    点击【创建 MCP】,打开创建 MCP 页面。

    +
      +
    • MCP 名称:MCP 的名称与 Logo,便于识别。MCP 的 Logo 在保存后可自定义上传。
    • +
    • 描述: MCP 详细说明以及使用注意事项。
    • +
    • MCP Server Config:使用 JSON 格式填写 MCP Server 配置参数。通过 SSE/Streamable HTTP 协议调用 MCP 服务中的工具。
    • +
    +
    +

    创建MCP

    +
    +

    已创建成功的 MCP,默认状态为【已禁用】。开启 MCP 后,可以在【高级编排应用】->【AI 对话】的 MCP 中进行引用。

    +
    +

    MCP使用

    +

    4 工具商店

    +
    +

    工具商店是 MaxKB 系统中的一个功能模块,帮助用户扩展系统的功能。

    +
    +

    工具商店

    +
    +

    工具商店中的工具主要分为系统内置工具和工具商店两部分:

    +

    系统内置:

    +
      +
    • 联网搜索:提供 Web 搜索功能,如 Google Search、博查搜索、LangSearch 等,帮助用户快速从互联网获取信息。
    • +
    • 数据库查询:支持连接不同类型的数据库并执行查询,如 MySQL 查询、PostgreSQL 查询等,方便用户管理和分析数据。
    • +
    +
    +

    工具商店

    +
    +

    工具商店:用户可直接在商店中选择所需的工具,无需手动开发或进行复杂集成,可以显著提升工具的调用效率。

    +

    为了丰富工具商店资源,推动产品生态持续发展,MaxKB 诚挚邀请广大社区用户参与工具贡献,共享技术成果:

    +
      +
    • 贡献路径:开发者可以按照官方提供的工具开发规范开发适用于 MaxKB 的工具(例如API对接类、本地功能类具等);
    • +
    • 提交方式:完成开发后,将工具代码提交至 GitHub 官方工具仓库,项目团队将按流程审核,通过后即可上架至 MaxKB 工具商店,供全体社区用户使用;
    • +
    • 共建开发生态:社区贡献的工具不仅能帮助更多用户解决实际问题,也将促进 MaxKB 工具生态的多样化发展,形成“用户需求-工具开发-生态完善” 的正向循环。
    • +
    +
    +

    工具商店

    +
    +

    内置工具添加后,在配置启动参数(例如数据库连接信息、API Key 等)并启用后,便可在高级编排应用中调用。

    +
    +

    启动参数

    +

    参数配置

    +

    高级编排应用

    +

    5 工具导出/导入

    +
    +

    工具支持导出和导入,导出的文件后缀为 .tool

    +
    +

    函数导出

    +
    +

    点击【导入创建】,选择后缀名为 .tool 的文件并打开。

    +
    +

    函数导入

    +
    +

    工具将自动导入,导入的工具默认状态为【已禁用】,可以点击工具,进入编辑工具查看和修改工具。

    +
    +

    函数导入成功

    +

    6 复制工具

    +
    +

    点击工具面板的【复制】按钮,打开复制工具对话框,对原工具内容进行编辑修改后点击【创建】即可快速创建一个新工具。

    +
    +

    复制工具

    +

    复制工具

    +

    7 删除工具

    +
    +

    点击工具面板的【删除】按钮,即可对工具进行删除。

    +
    +

    删除工具

    +
    +

    注意: 工具删除后,不可恢复。 如果应用引用了该工具,在编排页面将显示【该工具不可用】的提示信息。

    +
    +

    应用引用已删除工具

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/v2/user_manual/user_community/index.html b/v2/user_manual/user_community/index.html new file mode 100644 index 00000000..60204972 --- /dev/null +++ b/v2/user_manual/user_community/index.html @@ -0,0 +1,3053 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 用户管理 - MaxKB 文档 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + 跳转至 + + +
    +
    + +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + +

    用户管理

    +

    1 用户列表

    +
    +

    系统管理员可以创建及管理用户。

    +
    +

    用户列表

    +

    2 创建用户

    +
    +

    支持系统管理员创建用户:

    +
      +
    • 用户名:用户账号信息,不支持修改;
    • +
    • 姓名:用户姓名;
    • +
    • 邮箱:用户邮箱;
    • +
    • 手机号:用户手机号;
    • +
    • 默认密码:默认为MaxKB@123..
    • +
    • 角色设置:选择普通用户和工作空间角色时需要设置工作空间。
    • +
    +

    注意:角色管理为企业版 X-Pack 功能。

    +
    +

    用户列表

    +

    3 编辑用户

    +
    +

    用户名不可以编辑,其他属性均可以编辑。
    +注意:角色管理为企业版 X-Pack 功能。

    +
    +

    用户列表

    +
    +

    用户状态已禁用,则用户无法登录 MaxKB。

    +
    +

    用户列表

    +

    4 重置密码

    +
    +

    系统管理员可以给每个用户修改密码,在用户列表中,点击【修改密码】,弹出修改密码对话框,保存后修改成功。

    +
    +

    用户列表

    +

    5 删除用户

    +
    +

    在用户列表中,点击【删除】,弹出提示框,确认后仅删除当前用户。
    +注意:系统内置 admin 用户不能被删除。

    +
    +

    用户列表

    +

    6 查询用户

    +
    +

    支持通过用户名、姓名、邮箱进行用户搜索。

    +
    +

    用户列表

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/versions.json b/versions.json new file mode 100644 index 00000000..ef1ce3f5 --- /dev/null +++ b/versions.json @@ -0,0 +1 @@ +[{"version": "v2", "title": "v2", "aliases": []}, {"version": "v1", "title": "v1", "aliases": []}] \ No newline at end of file