From 331b341fad769a3bf691892d3199a8549ac45696 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Barbara=20Czy=C5=BC?= Date: Wed, 9 Oct 2024 09:21:09 +0200 Subject: [PATCH 01/13] update the list of models (#609) --- content/guides/box-ai/supported-models.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/content/guides/box-ai/supported-models.md b/content/guides/box-ai/supported-models.md index 72365119f..33ac65ac3 100644 --- a/content/guides/box-ai/supported-models.md +++ b/content/guides/box-ai/supported-models.md @@ -29,7 +29,8 @@ may be limited. | Provider | Family |Availability| API Name | External documentation | Capability | | --------------- | ------ |-----| --------------------------------------- | ----------------------------------------------------------------------- | ---------- | -| Microsoft Azure | GPT |available| `azure__openai__gpt_3_5_turbo_16k` | [Azure OpenAI GPT-3.5 model documentation][azure-ai-model] | Chat | +| Microsoft Azure | GPT |available| `azure__openai__gpt_3_5_turbo_16k` | [Azure OpenAI GPT-3.5 model documentation][azure-ai-model-gpt35] | Chat | +| Microsoft Azure | GPT |available| `azure__openai__gpt_4o_mini` | [Azure OpenAI GPT-3.5 model documentation][azure-ai-model-gpt40] | Chat | | Microsoft Azure | GPT |available| `azure__openai__text_embedding_ada_002` | [Azure OpenAI embeddings models documentation][azure-ai-embeddings] | Embeddings | | GCP Vertex | Gecko | available |`google__textembedding_gecko` | [Google Vertex AI embeddings models documentation][vertex-ai-model] | Embeddings | | GCP Vertex | Gecko | available |`google__textembedding_gecko_002` | [Google Vertex AI embeddings model documentation][vertex-ai-model] | Embeddings | @@ -49,7 +50,8 @@ may be limited. [text-gen]: e://post_ai_text_gen [agent]: e://get_ai_agent_default [openai-gpt-3-5-model]: https://platform.openai.com/docs/models/gpt-3-5-turbo -[azure-ai-model]: https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models#gpt-35 +[azure-ai-model-gpt35]: https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models#gpt-35 +[azure-ai-model-gpt40]: https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models#gpt-4o-and-gpt-4-turbo [vertex-ai-model]: https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#models [vertex-ai-gemini-models]: https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#gemini-models [vertex-text-models]: https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/text From d11d281487fa48f53245316a986c5a505e647253 Mon Sep 17 00:00:00 2001 From: Tim Berry Date: Wed, 9 Oct 2024 03:23:21 -0700 Subject: [PATCH 02/13] Update community-projects.md (#608) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixed link on sdk-poshbox to correct location Co-authored-by: Barbara Czyż --- content/pages/support/community-projects.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/pages/support/community-projects.md b/content/pages/support/community-projects.md index 04591b1f2..f942e780b 100644 --- a/content/pages/support/community-projects.md +++ b/content/pages/support/community-projects.md @@ -64,7 +64,7 @@ Want to submit your project? Please review the [sdk-ruby]: https://github.com/cburnette/boxr [sdk-r]: https://github.com/brendan-r/boxr [sdk-powershell]: https://github.com/box-community/box-powershell-sdk-v2 -[sdk-poshbox]: https://github.com/thelastofreed/PoshBox +[sdk-poshbox]: https://github.com/enthusedcoder/poshbox [sdk-php-laravel]: https://github.com/maengkom/boxapi [sdk-ph]: https://github.com/golchha21/BoxPHPAPI [connector-azure]: https://docs.microsoft.com/en-us/azure/connectors/connectors-create-api-box From 25d325b1ea5b01056fb2fddab1b6aba7ed56239e Mon Sep 17 00:00:00 2001 From: Kamil Berdychowski Date: Thu, 10 Oct 2024 14:25:23 +0200 Subject: [PATCH 03/13] docs(APIMGMT-618): Texts for versioning (#611) --- content/microcopy/reference.yml | 26 ++++++++++++++++++++++++++ content/microcopy/versions.yml | 7 ++----- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/content/microcopy/reference.yml b/content/microcopy/reference.yml index a8074ce7c..cffd0ffe1 100644 --- a/content/microcopy/reference.yml +++ b/content/microcopy/reference.yml @@ -28,6 +28,10 @@ titles: The title for the section of a resource that shows what a typical resource looks like resource_example: Response Example + // deprecated_entries: |- + The title for the section of an endpoint that shows + deprecated entries + deprecated_entries: Deprecated buttons: // copy: |- @@ -225,3 +229,25 @@ tooltips: Describes how a request header name is not case sensitive header: |- Header names are never case sensitive + +pill: + // beta: |- + Pill added to beta endpoints and resources + beta: Beta + // latest_version: |- + Pill added to the latest version of an endpoint or resources + latest_version: Latest version + // deprecated: |- + Pill added to deprecated endpoints and resources + deprecated: Deprecated + +sidebar: + titles: + // deprecated_entries: |- + The title for the sidebar section of an endpoint that shows + deprecated entries + deprecated_entries: Deprecated + + filter: + // placeholder: Placeholder text for the search filter in the sidebar + placeholder: "Filter by name" diff --git a/content/microcopy/versions.yml b/content/microcopy/versions.yml index 00c93b74e..0b18fb8a2 100644 --- a/content/microcopy/versions.yml +++ b/content/microcopy/versions.yml @@ -1,6 +1,3 @@ --- -version_options: - v_2024_0: "2024.0" - v_2024_1: "2024.1" - v_2025_0: "2025.0" -placeholder: Select API version +// label: The prefix for the selected API version +label: API version From 286469d6171568d1383955da5d2ed3b559b13844 Mon Sep 17 00:00:00 2001 From: Olga Stefaniuk Date: Fri, 11 Oct 2024 12:03:02 +0200 Subject: [PATCH 04/13] Dev zone updates (#605) * Fix typo * Add video section in the AI Dev zone * Change documentation pill description * Update video section captions * Improve copy after review * Update copy for q&a endpoint * Improve SDK TS naming * Improve SDK TS naming * Adjust wording in video description --- content/guides/tooling/sdks/index.md | 2 +- content/guides/tooling/sdks/node.md | 2 +- content/guides/tooling/sdks/typescript-gen.md | 6 +- content/microcopy/footer.yml | 6 +- content/pages/ai-dev-zone/index.md | 107 +++++++++++++--- content/pages/index.md | 117 +++--------------- content/pages/sdks-and-tools/index.md | 4 +- 7 files changed, 117 insertions(+), 127 deletions(-) diff --git a/content/guides/tooling/sdks/index.md b/content/guides/tooling/sdks/index.md index e48e35b61..ed2c2f41a 100644 --- a/content/guides/tooling/sdks/index.md +++ b/content/guides/tooling/sdks/index.md @@ -37,7 +37,7 @@ these projects to full parity. ## Next generation SDKs -The latest generation Box Python SDK, Box Typescript +The latest generation Box Python SDK, Box TypeScript SDK, .NET SDK, and Swift SDK are designed to elevate the developer experience and streamline your integration with the Box Content Cloud. diff --git a/content/guides/tooling/sdks/node.md b/content/guides/tooling/sdks/node.md index a7facbf17..075e2e9d4 100644 --- a/content/guides/tooling/sdks/node.md +++ b/content/guides/tooling/sdks/node.md @@ -20,7 +20,7 @@ project. [Node SDK][node] is currently in maintenance mode and will be deprecated soon. This means only critical security updates and bug fixes will be implemented. - It is recommended to use the [auto-generated Typescript SDK][ts-gen]. + It is recommended to use the [auto-generated TypeScript SDK][ts-gen]. diff --git a/content/guides/tooling/sdks/typescript-gen.md b/content/guides/tooling/sdks/typescript-gen.md index 96127e203..4d5749ee6 100644 --- a/content/guides/tooling/sdks/typescript-gen.md +++ b/content/guides/tooling/sdks/typescript-gen.md @@ -13,16 +13,16 @@ alias_paths: [] # Install Typescript SDK (Generated) -You can use the **auto-generated** Box Typescript SDK to call Box APIs in a Typescript project. +You can use the **auto-generated** Box TypeScript SDK to call Box APIs in a TypeScript project. This [next generation SDK][next-gen] brings along new functionality to designed to elevate the developer experience and streamline your integration with the Box Content Cloud. - Learn more about auto-generated Typescript SDK on GitHub + Learn more about auto-generated TypeScript SDK on GitHub ## NPM installation -To install the Typescript SDK run the following command from your terminal +To install the TypeScript SDK run the following command from your terminal window or command prompt using the [Node Package Manager][npm]. ```shell diff --git a/content/microcopy/footer.yml b/content/microcopy/footer.yml index 0f9e9464c..e9e6522ad 100644 --- a/content/microcopy/footer.yml +++ b/content/microcopy/footer.yml @@ -55,9 +55,9 @@ categories: links: ts_gen_sdk: - // text: Text for link to the Typescript SDK (Generated) - text: Typescript SDK (Generated) - // url: link to the Typescript SDK (Generated) + // text: Text for link to the TypeScript SDK (Generated) + text: TypeScript SDK (Generated) + // url: link to the TypeScript SDK (Generated) url: https://github.com/box/box-typescript-sdk-gen java_sdk: diff --git a/content/pages/ai-dev-zone/index.md b/content/pages/ai-dev-zone/index.md index 276fcdb2c..39a3371e6 100644 --- a/content/pages/ai-dev-zone/index.md +++ b/content/pages/ai-dev-zone/index.md @@ -6,7 +6,7 @@ centered: false # Box AI Developer Zone - +
Box AI
Developer Zone @@ -20,14 +20,12 @@ view sample code, explore Box AI use cases, and more! -
+
Try out interactive demos
-

- Box AI API is currently a beta feature. Bear in mind that - the available capabilities can change. -

- +Box AI API is currently a beta feature offered subject to Box’s Main Beta Agreement, and the available capabilities may change. Box AI API is available to all Enterprise Plus customers. + + Summarize a document in a selected tone of voice. @@ -44,40 +42,109 @@ view sample code, explore Box AI use cases, and more! Public beta -
- Box AI API documentation and support + Documentation and support

These resources will get you up and running with Box AI API.

- Check the API reference for specification details. + + Documentation - Browse the guides to learn how to use Box AI API. + + Documentation - Check table list of the supported AI models. + + Documentation - - Visit Box Developer Community for support. + Visit Box Developer Community for support and knowledge sharing. + + Community
+ + +
+ Box for AI Integrations +
+

+ Use Box for AI Integrations to extend LLM models' existing knowledge bases. +

+ + + + Enable access to Box content within LLM workflows with Box reader suite for LlamaIndex. + + New + + + Include Box content in your LLM workflows with Box loader for LangChain. + + New + + +
+ + +
+ Videos +
+ Watch the latest Box AI API tutorials and demos. + + + + Check out the high-level features of the Box AI API in one minute. + + + + See a demo of the Box AI API text generation endpoint. + + + + See a demo of the Box AI API document Q&A endpoint. + + + + Extract metadata with various prompt formats with Box AI API. + + + + Extract metadata with predefined structure with Box AI API. + + + + Learn why Box chose to expose Box AI through our public API. + + + + + + View all videos + +
diff --git a/content/pages/index.md b/content/pages/index.md index c602aab40..aa7ac4a56 100644 --- a/content/pages/index.md +++ b/content/pages/index.md @@ -35,40 +35,6 @@ All the developer resources to help you get the most from Box products - -
I'm new to Box Platform. How do I start? @@ -76,7 +42,7 @@ All the developer resources to help you get the most from Box products We got you covered! Follow these steps to build new applications and discover Box Platform capabilities. - + Box Platform covers many use cases @@ -95,28 +61,17 @@ All the developer resources to help you get the most from Box products Credentials, and App Token authentication. Learn more and select the method that applies to your app. - - Optionally, follow the Box CLI quickstart - guide to have an API testing space. It takes less than - five minutes to start developing! - - - We always recommend putting pen to paper and drawing out your solution. - Have a look at the most common architecture patterns to get inspired! - - Now, you can start building! Launch the Developer Console and create an application of your choice. - Read about the authorization requirements you have to fulfill to start using you app. - Finally, explore our developer toolkit: API Reference, SDKS, Box CLI, Postman Collection, Box UI Elements and much more! @@ -143,26 +98,30 @@ All the developer resources to help you get the most from Box products href="/reference/"> *Box API Reference* - + *box-python-sdk-gen* + + *box-java-sdk* - - *box-python-sdk* + + *box-typescript-sdk-gen* - - *box-node-js-sdk* + + *box-dotnet-sdk-gen* - - *box-windows-sdk-v2* - - *box-ios-sdk* + + *box-swift-sdk-gen* + *Box Postman Collection* @@ -184,42 +143,6 @@ All the developer resources to help you get the most from Box products - - diff --git a/content/pages/sdks-and-tools/index.md b/content/pages/sdks-and-tools/index.md index aa139f297..2fc27217d 100644 --- a/content/pages/sdks-and-tools/index.md +++ b/content/pages/sdks-and-tools/index.md @@ -19,7 +19,7 @@ The following SDKs and tools are developed and supported by Box. Here you will find a list of SDKs you can use to build your application. Separately, we have listed the next generation -Python, Typescript, and .NET SDKs, which are the +Python, TypeScript, and .NET SDKs, which are the newest addition. .NET is still a beta feature, but we encourage you to give it a try and explore all the @@ -42,7 +42,7 @@ these projects to full parity. ### Next generation SDKs -The latest generation Box Python SDK, Box Typescript +The latest generation Box Python SDK, Box TypeScript SDK, .NET SDK, and Swift SDK are designed to elevate the developer experience and streamline your integration with the Box Content Cloud. From 17caf6a271757d92ce0bdf0a4070fb214e4ee635 Mon Sep 17 00:00:00 2001 From: Olga Stefaniuk Date: Fri, 11 Oct 2024 15:38:03 +0200 Subject: [PATCH 05/13] Buie landing page and new menu (#612) * Add BUIE site * Improve copy * Improve copy * Add buie demo component * Update buie page icons * Improve copy * Add microcopy for buie * Adjust menu items * Add new main menu * Adjust community menu * Adjust community menu * Update main navigation * Fix linting errors * Enable media section, change main text * Update BUIE demo copy * Update copy * Improve copy after review * Add BUIE AI video description --- content/microcopy/box_ui_elements.yml | 19 ++++++ content/microcopy/headers.yml | 79 +++++++++++++++++++----- content/microcopy/index.yml | 3 + content/pages/box-ui-elements/index.md | 83 ++++++++++++++++++++++++++ 4 files changed, 169 insertions(+), 15 deletions(-) create mode 100644 content/microcopy/box_ui_elements.yml create mode 100644 content/pages/box-ui-elements/index.md diff --git a/content/microcopy/box_ui_elements.yml b/content/microcopy/box_ui_elements.yml new file mode 100644 index 000000000..efd66984a --- /dev/null +++ b/content/microcopy/box_ui_elements.yml @@ -0,0 +1,19 @@ +--- +demoTiles: + contentExplorer: + title: Content Explorer + description: Embed a folder view of content stored in Box in your + web applications. Allow users to navigate through the folder hierarchy + and rename, delete, or share files. + contentPicker: + title: Content Picker + description: Add support for selecting Box files and folders in your + web applications. + contentPreview: + title: Content Preview + description: Embed high quality and interactive previews of over 120 + file types. + contentSidebar: + title: Content Sidebar + description: Implement viewing file-related activity, metadata, and details + including versions, comments, and tasks. diff --git a/content/microcopy/headers.yml b/content/microcopy/headers.yml index 74c6968da..cebdbbfba 100644 --- a/content/microcopy/headers.yml +++ b/content/microcopy/headers.yml @@ -5,6 +5,18 @@ primary: // text: text: Documentation + develop: + // text: + text: Develop + + connect: + // text: + text: Connect + + explore: + // text: + text: Explore + quickstarts: // text: text: Getting Started @@ -13,8 +25,15 @@ primary: // text: text: Community + community_forum: + // text: + text: Box Developer Community + //url: - url: https://forum.box.com + url: https://community.box.com/ + + events: + text: Events learn: // text: The text for the link to the learn section @@ -30,6 +49,14 @@ primary: //url: The URL to the learn section url: /sign/ + ai_dev_zone: + text: Box AI Developer Zone + url: /sign/ + + buie: + text: Box UI Elements + url: /box-ui-elements + get_started: // text: The text for the link to the old Get Started guides text: Quick Start @@ -73,17 +100,15 @@ primary: additional_resouces: text: Additional resources + overview: + text: Overview + blog: // text: The text for the Medium Dev Blog text: Box Developer Blog // url: The URL to Medium bev blog url: https://medium.com/box-developer-blog - # events_and_workshops: - # // text: The text for the link to events and workshops - # text: Events & Workshops - # // url: The URL to the developer blog - # url: TBD buttons: dashboard: @@ -109,7 +134,7 @@ primary: featured: tag: - text: Featured + text: New title: text: Box AI Developer Zone @@ -122,8 +147,38 @@ primary: cta: text: |- Try it out! - url: - /ai-dev-zone/ + + develop_featured: + tag: + text: Featured + + title: + text: Box Sample Code Catalog + + details: + text: |- + Browse 90+ open-source repositories + in various programming languages to find useful scripts, + app examples, and inspiring use cases! + + cta: + text: |- + Browse sample code + + connect_featured: + tag: + text: Event + + title: + text: BoxWorks + + details: + text: |- + Join BoxWorks 2024 to discover what's possible with content and AI! + + cta: + text: |- + Register now secondary: images: @@ -157,12 +212,6 @@ secondary: // url: The URL to the developer blog url: https://medium.com/box-developer-blog - # events_and_workshops: - # // text: The text for the link to events and workshops - # text: Events & Workshops - - # // url: The URL to the developer blog - # url: TBD dropdowns: // docs: |- diff --git a/content/microcopy/index.yml b/content/microcopy/index.yml index c4e18ddfa..99e49d338 100644 --- a/content/microcopy/index.yml +++ b/content/microcopy/index.yml @@ -44,5 +44,8 @@ sample_code_catalog: ai_dev_zone: $ref: "content/microcopy/ai_dev_zone.yml" +box_ui_elements: + $ref: "content/microcopy/box_ui_elements.yml" + versions: $ref: "content/microcopy/versions.yml" diff --git a/content/pages/box-ui-elements/index.md b/content/pages/box-ui-elements/index.md new file mode 100644 index 000000000..d66651b18 --- /dev/null +++ b/content/pages/box-ui-elements/index.md @@ -0,0 +1,83 @@ +--- +hide_title: true +alias_paths: [] +centered: false +--- +# Box AI Developer Zone + + + +
+ Create
+ experiences with
+ Box UI Elements +
+ +Box UI Elements are pre-built UI components that allow you to extend custom portals with the elements of the main Box web application. +
+
+ + +
+ Interactive Demos +
+

+ Box UI Elements are available both as React components and framework-agnostic JavaScript libraries. +

+ + + + Get started + +
+ + +
+ Explore more Box UI Elements +
+

+ Follow more guides and documentation + to help get you up and running. +

+ + + + See how to embed Box AI in the Content Preview UI Element. + + + Embed the Content Uploader and allow users to upload files. + + + Display files based on specified metadata with the Content Explorer. + + + Provide collaboration capabilities within the Content Preview. + + +
+ + +
+ Build custom portals +
+ Learn more from videos, blog posts and sample code related to Box UI Elements. + + + + Build a content portal with a customized experience using Box UI Elements. + + + Featuring Box APIs, Box UI Elements, React, Tailwind CSS, and Vercel. + + + See how to embed Box AI in the Content Preview UI Element. + + +
From ac2b719071915e2a8323e790bfe1e4922ec3cae4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Barbara=20Czy=C5=BC?= Date: Tue, 15 Oct 2024 10:12:06 +0200 Subject: [PATCH 06/13] DDOC-1152: add guides for AI model overrides (#610) * AI agents tutorials initial version * improvements * minor fixes * samples fix * add links * remove dialogue history * added links --- .spelling | 3 +- .../ai-agents/get-agent-default-config.md | 232 +++++++++++- content/guides/box-ai/ai-agents/index.md | 23 +- .../box-ai/ai-agents/overrides-tutorial.md | 357 ++++++++++++++++++ content/guides/box-ai/ask-questions.md | 6 +- .../box-ai/extract-metadata-structured.md | 4 +- content/guides/box-ai/extract-metadata.md | 8 +- content/guides/box-ai/generate-text.md | 5 +- 8 files changed, 609 insertions(+), 29 deletions(-) create mode 100644 content/guides/box-ai/ai-agents/overrides-tutorial.md diff --git a/.spelling b/.spelling index cb36efe50..91e9cd342 100644 --- a/.spelling +++ b/.spelling @@ -314,4 +314,5 @@ GPT-4 GPT-3 freeform pre-defined -stringified \ No newline at end of file +stringified +params \ No newline at end of file diff --git a/content/guides/box-ai/ai-agents/get-agent-default-config.md b/content/guides/box-ai/ai-agents/get-agent-default-config.md index 02d71d055..8e0d16696 100644 --- a/content/guides/box-ai/ai-agents/get-agent-default-config.md +++ b/content/guides/box-ai/ai-agents/get-agent-default-config.md @@ -1,5 +1,5 @@ --- -rank: 7 +rank: 2 related_endpoints: - get_ai_agent_default - post_ai_text_gen @@ -18,13 +18,7 @@ Box AI API is currently a beta feature offered subject to Box’s Main Beta Agre The `GET /2.0/ai_agent_default` endpoint allows you to fetch the default configuration for AI services. -Once you get the configuration details, you can override them using the `ai_agent` parameter available in the [`POST /2.0/ai/ask`][ask] and [`POST /2.0/ai/text_gen`][text-gen] requests. - -Override examples include: - -* Replacing the default LLM with a custom one based on your organization's needs. -* Tweaking the base prompt to allow a more customized user experience. -* Changing a parameter, such as `temperature`, to make the results more or less creative. +Once you get the configuration details you can override them using the [`ai_agent`][ai-agent-config] parameter. ## Send a request @@ -44,10 +38,222 @@ To make a call, you must pass the following parameters. Mandatory parameters are | Parameter| Description| Example| |--------|--------|-------| |`language`| The language code the agent configuration is returned for. If the language is not supported, the default configuration is returned. | `ja-JP`| -|**`mode`**|The mode used to filter the agent configuration. The value can be `ask` or `text_gen`. |`ask`| -|`model`|The model you want to get the configuration for. To make sure your chosen model is supported, see the [list of models][models].| `openai__gpt_3_5_turbo`| +|**`mode`**|The mode used to filter the agent configuration. The value can be `ask`, `text_gen`, `extract`, or `extract_structured` depending on the result you want to achieve. |`ask`| +|`model`|The model you want to get the configuration for. To make sure your chosen model is supported, see the [list of models][models].| `azure__openai__gpt_3_5_turbo_16k`| + +## Responses + +The responses to the call may vary depending on the `mode` parameter value you choose. + + + + + +When you set the `mode` parameter to `ask` the response will be as follows: + +```sh +{ + "type": "ai_agent_ask", + "basic_text": { + "model": "azure__openai__gpt_4o_mini", + "system_message": "", + "prompt_template": "prompt_template": "{user_question}Write it in an informal way.{content}" + }, + "num_tokens_for_completion": 6000, + "llm_endpoint_params": { + "temperature": 0, + "top_p": 1, + "frequency_penalty": 0, + "presence_penalty": 1.5, + "stop": "<|im_end|>", + "type": "openai_params" + } + }, + "long_text": { + "model": "azure__openai__gpt_4o_mini", + "system_message": "", + "prompt_template": "prompt_template": "{user_question}Write it in an informal way.{content}" + }, + "num_tokens_for_completion": 6000, + "llm_endpoint_params": { + "temperature": 0, + "top_p": 1, + "frequency_penalty": 0, + "presence_penalty": 1.5, + "stop": "<|im_end|>", + "type": "openai_params" + }, + "embeddings": { + "model": "azure__openai__text_embedding_ada_002", + "strategy": { + "id": "basic", + "num_tokens_per_chunk": 64 + } + } + }, + "basic_text_multi": { + "model": "azure__openai__gpt_4o_mini", + "system_message": "", + "prompt_template": "Current date: {current_date}\n\nTEXT FROM DOCUMENTS STARTS\n{content}\nTEXT FROM DOCUMENTS ENDS\n\nHere is how I need help from you: {user_question}\n.", + "num_tokens_for_completion": 6000, + "llm_endpoint_params": { + "temperature": 0, + "top_p": 1, + "frequency_penalty": 0, + "presence_penalty": 1.5, + "stop": "<|im_end|>", + "type": "openai_params" + } + }, + "long_text_multi": { + "model": "azure__openai__gpt_4o_mini", + "system_message": "Role and Goal: You are an assistant designed to analyze and answer a question based on provided snippets from multiple documents, which can include business-oriented documents like docs, presentations, PDFs, etc. The assistant will respond concisely, using only the information from the provided documents.\n\nConstraints: The assistant should avoid engaging in chatty or extensive conversational interactions and focus on providing direct answers. It should also avoid making assumptions or inferences not supported by the provided document snippets.\n\nGuidelines: When answering, the assistant should consider the file's name and path to assess relevance to the question. In cases of conflicting information from multiple documents, it should list the different answers with citations. For summarization or comparison tasks, it should concisely answer with the key points. It should also consider the current date to be the date given.\n\nPersonalization: The assistant's tone should be formal and to-the-point, suitable for handling business-related documents and queries.\n", + "prompt_template": "Current date: {current_date}\n\nTEXT FROM DOCUMENTS STARTS\n{content}\nTEXT FROM DOCUMENTS ENDS\n\nHere is how I need help from you: {user_question}\n.", + "num_tokens_for_completion": 6000, + "llm_endpoint_params": { + "temperature": 0, + "top_p": 1, + "frequency_penalty": 0, + "presence_penalty": 1.5, + "stop": "<|im_end|>", + "type": "openai_params" + }, + "embeddings": { + "model": "azure__openai__text_embedding_ada_002", + "strategy": { + "id": "basic", + "num_tokens_per_chunk": 64 + } + } + } +} +``` + + + + + +When you set the `mode` parameter to `text_gen` the response will be as follows: + +```sh +{ + "type": "ai_agent_text_gen", + "basic_gen": { + "model": "azure__openai__gpt_3_5_turbo_16k", + "system_message": "\nIf you need to know today's date to respond, it is {current_date}.\nThe user is working in a collaborative document creation editor called Box Notes.\nAssume that you are helping a business user create documents or to help the user revise existing text.\nYou can help the user in creating templates to be reused or update existing documents, you can respond with text that the user can use to place in the document that the user is editing.\nIf the user simply asks to \"improve\" the text, then simplify the language and remove jargon, unless the user specifies otherwise.\nDo not open with a preamble to the response, just respond.\n", + "prompt_template": "{user_question}", + "num_tokens_for_completion": 12000, + "llm_endpoint_params": { + "temperature": 0.1, + "top_p": 1, + "frequency_penalty": 0.75, + "presence_penalty": 0.75, + "stop": "<|im_end|>", + "type": "openai_params" + }, + "embeddings": { + "model": "azure__openai__text_embedding_ada_002", + "strategy": { + "id": "basic", + "num_tokens_per_chunk": 64 + } + }, + "content_template": "`````{content}`````" + } +} +``` + + + + + +When you set the `mode` parameter to `extract` the response will be as follows: + +```sh +{ + "type": "ai_agent_extract", + "basic_text": { + "model": "google__gemini_1_5_flash_001", + "system_message": "Respond only in valid json. You are extracting metadata that is name, value pairs from a document. Only output the metadata in valid json form, as {\"name1\":\"value1\",\"name2\":\"value2\"} and nothing else. You will be given the document data and the schema for the metadata, that defines the name, description and type of each of the fields you will be extracting. Schema is of the form {\"fields\": [{\"key\": \"key_name\", \"displayName\": \"key display name\", \"type\": \"string\", \"description\": \"key description\"}]}. Leverage key description and key display name to identify where the key and value pairs are in the document. In certain cases, key description can also indicate the instructions to perform on the document to obtain the value. Prompt will be in the form of Schema is ``schema`` \n document is ````document````", + "prompt_template": "If you need to know today's date to respond, it is {current_date}. Schema is ``{user_question}`` \n document is ````{content}````", + "num_tokens_for_completion": 4096, + "llm_endpoint_params": { + "temperature": 0, + "top_p": 1, + "top_k": null, + "type": "google_params" + } + }, + "long_text": { + "model": "google__gemini_1_5_flash_001", + "system_message": "Respond only in valid json. You are extracting metadata that is name, value pairs from a document. Only output the metadata in valid json form, as {\"name1\":\"value1\",\"name2\":\"value2\"} and nothing else. You will be given the document data and the schema for the metadata, that defines the name, description and type of each of the fields you will be extracting. Schema is of the form {\"fields\": [{\"key\": \"key_name\", \"displayName\": \"key display name\", \"type\": \"string\", \"description\": \"key description\"}]}. Leverage key description and key display name to identify where the key and value pairs are in the document. In certain cases, key description can also indicate the instructions to perform on the document to obtain the value. Prompt will be in the form of Schema is ``schema`` \n document is ````document````", + "prompt_template": "If you need to know today's date to respond, it is {current_date}. Schema is ``{user_question}`` \n document is ````{content}````", + "num_tokens_for_completion": 4096, + "llm_endpoint_params": { + "temperature": 0, + "top_p": 1, + "top_k": null, + "type": "google_params" + }, + "embeddings": { + "model": "azure__openai__text_embedding_ada_002", + "strategy": { + "id": "basic", + "num_tokens_per_chunk": 64 + } + } + } +} +``` + + + + + +When you set the `mode` parameter to `extract_structured` the response will be as follows: + +```sh +{ + "type": "ai_agent_extract_structured", + "basic_text": { + "model": "google__gemini_1_5_flash_001", + "system_message": "Respond only in valid json. You are extracting metadata that is name, value pairs from a document. Only output the metadata in valid json form, as {\"name1\":\"value1\",\"name2\":\"value2\"} and nothing else. You will be given the document data and the schema for the metadata, that defines the name, description and type of each of the fields you will be extracting. Schema is of the form {\"fields\": [{\"key\": \"key_name\", \"prompt\": \"prompt to extract the value\", \"type\": \"date\"}]}. Leverage prompt for each key to identify where the key and value pairs are in the document. In certain cases, prompt can also indicate the instructions to perform on the document to obtain the value. Prompt will be in the form of Schema is ``schema`` \n document is ````document````", + "prompt_template": "If you need to know today's date to respond, it is {current_date}. Schema is ``{user_question}`` \n document is ````{content}````", + "num_tokens_for_completion": 4096, + "llm_endpoint_params": { + "temperature": 0, + "top_p": 1, + "top_k": null, + "type": "google_params" + } + }, + "long_text": { + "model": "google__gemini_1_5_flash_001", + "system_message": "Respond only in valid json. You are extracting metadata that is name, value pairs from a document. Only output the metadata in valid json form, as {\"name1\":\"value1\",\"name2\":\"value2\"} and nothing else. You will be given the document data and the schema for the metadata, that defines the name, description and type of each of the fields you will be extracting. Schema is of the form {\"fields\": [{\"key\": \"key_name\", \"prompt\": \"prompt to extract the value\", \"type\": \"date\"}]}. Leverage prompt for each key to identify where the key and value pairs are in the document. In certain cases, prompt can also indicate the instructions to perform on the document to obtain the value. Prompt will be in the form of Schema is ``schema`` \n document is ````document````", + "prompt_template": "If you need to know today's date to respond, it is {current_date}. Schema is ``{user_question}`` \n document is ````{content}````", + "num_tokens_for_completion": 4096, + "llm_endpoint_params": { + "temperature": 0, + "top_p": 1, + "top_k": null, + "type": "google_params" + }, + "embeddings": { + "model": "google__textembedding_gecko_003", + "strategy": { + "id": "basic", + "num_tokens_per_chunk": 64 + } + } + } +} +``` + + + + [prereq]: g://box-ai/prerequisites -[ask]: e://post_ai_ask#param_ai_agent -[text-gen]: e://post_ai_text_gen#param_ai_agent -[models]: g://box-ai/supported-models \ No newline at end of file +[models]: g://box-ai/supported-models +[ai-agent-config]: g://box-ai/ai-agents/overrides-tutorial +[override-tutorials]: g://box-ai/ai-agents/overrides-tutorial \ No newline at end of file diff --git a/content/guides/box-ai/ai-agents/index.md b/content/guides/box-ai/ai-agents/index.md index 56f5cc906..6ae9ec0c4 100644 --- a/content/guides/box-ai/ai-agents/index.md +++ b/content/guides/box-ai/ai-agents/index.md @@ -2,16 +2,29 @@ rank: 1 related_endpoints: - get_ai_agent_default + - post_ai_text_gen + - post_ai_ask + - post_ai_extract + - post_ai_extract_structured related_guides: - - box-ai/index + - box-ai/ai-agents/get-agent-default-config + - box-ai/ai-agents/overrides-tutorial --- -# AI agent configuration +# AI model overrides -You can use the `ai_agent` parameter available in the [`POST /2.0/ai/ask`][ask] and [`POST /2.0/ai/text_gen`][text-gen] requests to override the default agent configuration and introduce your own custom settings. +Box updates the default models across the endpoints on a regular basis to stay up to date with the most advanced options. -For details, see [AI agent default configuration][agent-default]. +If your implementation is based on Box AI, a new default model might alter the results in a way that could break or change a downstream process. Switching to a specific version may prevent encountering any issues. + +Selecting a specific model may also bring better results to your use case. This is why, you can switch to any model included in the [supported models][models] list. + +Apart from switching models, you can pass options to further customize the agents used in Box AI implementation and get the responses that suit your use case. + +To see specific use cases, check the [overrides tutorial][overrides]. [ask]: e://post_ai_ask#param_ai_agent [text-gen]: e://post_ai_text_gen#param_ai_agent -[agent-default]: g://box-ai/ai-agents/get-agent-default-config \ No newline at end of file +[agent-default]: g://box-ai/ai-agents/get-agent-default-config +[overrides]: g://box-ai/ai-agents/overrides-tutorial +[models]: g://box-ai/supported-models \ No newline at end of file diff --git a/content/guides/box-ai/ai-agents/overrides-tutorial.md b/content/guides/box-ai/ai-agents/overrides-tutorial.md new file mode 100644 index 000000000..e60ec7a1d --- /dev/null +++ b/content/guides/box-ai/ai-agents/overrides-tutorial.md @@ -0,0 +1,357 @@ +--- +rank: 4 +related_endpoints: + - get_ai_agent_default + - post_ai_text_gen + - post_ai_ask +related_guides: + - box-ai/prerequisites + - box-ai/ask-questions + - box-ai/generate-text +--- + +# Override AI model configuration + + +Box AI API is currently a beta feature offered subject to Box’s Main Beta Agreement, and the available capabilities may change. Box AI API is available to all Enterprise Plus customers. + + + +The `agent_ai` configuration allows you to override the default AI model configuration. It is available for the following endpoints: + +* [`POST ai/ask`][ask] +* [`POST ai/text_gen`][text-gen] +* [`POST ai/extract`][extract] +* [`POST ai/extract_structured`][extract-structured] + + + +Use the [`GET ai_agent_default`][agent] endpoint to fetch the default configuration. + + + +The override examples include: + +* Replacing the default AI model with a custom one based on your organization's needs. +* Tweaking the base `prompt` to allow a more customized user experience. +* Changing a parameter, such as `temperature`, to make the results more or less creative. + +## Sample configuration + +A sample configuration for `ai/ask` is as follows: + +```sh +{ + "type": "ai_agent_ask", + "basic_text": { + "llm_endpoint_params": { + "type": "openai_params", + "frequency_penalty": 1.5, + "presence_penalty": 1.5, + "stop": "<|im_end|>", + "temperature": 0, + "top_p": 1 + }, + "model": "azure__openai__gpt_3_5_turbo_16k", + "num_tokens_for_completion": 8400, + "prompt_template": "It is `{current_date}`, consider these travel options `{content}` and answer the `{user_question}`.", + "system_message": "You are a helpful travel assistant specialized in budget travel" + }, + "basic_text_multi": { + "llm_endpoint_params": { + "type": "openai_params", + "frequency_penalty": 1.5, + "presence_penalty": 1.5, + "stop": "<|im_end|>", + "temperature": 0, + "top_p": 1 + }, + "model": "azure__openai__gpt_3_5_turbo_16k", + "num_tokens_for_completion": 8400, + "prompt_template": "It is `{current_date}`, consider these travel options `{content}` and answer the `{user_question}`.", + "system_message": "You are a helpful travel assistant specialized in budget travel" + }, + "long_text": { + "embeddings": { + "model": "openai__text_embedding_ada_002", + "strategy": { + "id": "basic", + "num_tokens_per_chunk": 64 + } + }, + "llm_endpoint_params": { + "type": "openai_params", + "frequency_penalty": 1.5, + "presence_penalty": 1.5, + "stop": "<|im_end|>", + "temperature": 0, + "top_p": 1 + }, + "model": "azure__openai__gpt_3_5_turbo_16k", + "num_tokens_for_completion": 8400, + "prompt_template": "It is `{current_date}`, consider these travel options `{content}` and answer the `{user_question}`.", + "system_message": "You are a helpful travel assistant specialized in budget travel" + }, + "long_text_multi": { + "embeddings": { + "model": "openai__text_embedding_ada_002", + "strategy": { + "id": "basic", + "num_tokens_per_chunk": 64 + } + }, + "llm_endpoint_params": { + "type": "openai_params", + "frequency_penalty": 1.5, + "presence_penalty": 1.5, + "stop": "<|im_end|>", + "temperature": 0, + "top_p": 1 + }, + "model": "azure__openai__gpt_3_5_turbo_16k", + "num_tokens_for_completion": 8400, + "prompt_template": "It is `{current_date}`, consider these travel options `{content}` and answer the `{user_question}`.", + "system_message": "You are a helpful travel assistant specialized in budget travel" + } +} +``` + +### Differences in parameter sets + +The set of parameters available for `ask`, `text_gen`, `extract`, `extract_structured` differs slightly, depending on the API call. + + * The agent configuration for the `ask` endpoint includes `basic_text`, `basic_text_multi`, `long_text` and `long_text_multi` parameters. This is because of the `mode` parameter you use to specify if the request is for a single item or multiple items. If you selected `multiple_item_qa` as the `mode`, you can also use `multi` parameters for overrides. + + * The agent configuration for `text_gen` includes the `basic_gen` parameter + that is used to generate text. + +### LLM endpoint params + +The `llm_endpoint_params` configuration options differ depending on the overall AI model being [Google][google-params] or [OpenAI][openai-params] based. + +For example, both `llm_endpoint_params` objects accept a `temperature` parameter, but the outcome differs depending on the model. + +For Google models, the [`temperature`][google-temp] is used for sampling during response generation, which occurs when `top-P` and `top-K` are applied. Temperature controls the degree of randomness in the token selection. + +For OpenAI models, [`temperature`][openai-temp] is the sampling temperature with values between 0 and 2. Higher values like 0.8 make the output more random, while lower values like 0.2 make it more focused and deterministic. When introducing your own configuration, use `temperature` or or `top_p` but not both. + +### System message + +The `system_message` parameter's aim is to help the LLM understand its role and what it’s supposed to do. +For example, if your solution is processing travel itineraries, you can add a system message saying: + +```sh +You are a travel agent aid. You are going to help support staff process large amounts of schedules, tickets, etc. +``` + +This message is separate from the content you send in, but it can improve the results. + +### Number of tokens for completion + +The `num_tokens_for_completion` parameter represents the number of [tokens][openai-tokens] Box AI can return. This number can vary based on the model used. + +## Use case: Box AI Q&A + +This example shows how to use the `prompt_template` parameter to change the +query result. +The first step is to ask Box AI to summarize a document about Box AI for Documents. +The `mode` parameter is set to `single_item_qa` because only one document is supplied. + +```sh +curl -i -L POST "https://api.box.com/2.0/ai/ask" \ +-H "content-type: application/json" \ +-H "authorization: " \ +-d '{ + "mode": "single_item_qa", + "prompt": "Summarize this article about Box AI for Documents", + "items": [ + { + "type": "file", + "id": "123467890" + } + ] + }' +``` + +You will get a response similar to the following: + +```sh +{ + "answer": "Box AI for Documents is a tool that enhances document analysis by allowing users to summarize content, identify key points, and draft outlines directly from files in Box. It supports various file types, including text documents, spreadsheets, and presentation slides. Users can initiate interactions with Box AI through the web app, where they can select suggestions or type specific questions. Responses are generated in real time, and users have options to save or clear chat history. The document also provides guidelines for effective inquiries and troubleshooting tips for potential issues with using Box AI.", + "created_at": "2024-10-08T00:29:07.283-07:00", + "completion_reason": "done" +} +``` + +To further improve the result, you can use the `prompt_template` parameter to add some more instructions for Box AI. In this example, let's change the tone of the response. + +```sh +{ + "prompt": "Summarize this article about Box AI for Documents", + "mode": "single_item_qa", + "items": [ + { + "id": "123467890", + "type": "file" + } + ], + "ai_agent": { + "type": "ai_agent_ask", + "basic_text": { + "prompt_template": "prompt_template": "{user_question} Write the summary in an informal way.{content}" + }, + } + } +} +``` + +The response would be slightly less formal: + +```sh +{ + "answer": "Box AI for Documents is a tool that helps you analyze and gain insights from your documents in Box. You can use it to summarize content, identify key points, and draft outlines, making it easier to handle meeting notes, reports, and marketing materials. To get started, just open a file in the Box web app and click the Box AI button. It offers quick suggestions like summarizing the document or checking for next steps. Responses are generated in real time, and you can save them or clear chat history as needed. Just remember, Box AI only pulls info from the document you're viewing, so be specific with your questions!", + "created_at": "2024-10-08T00:38:01.767-07:00", + "completion_reason": "done" +} +``` + +## Use case: Generating text + +This example shows you how changing the AI model in the `ai_agent` options can influence the way the text is generated. + +First let's generate some text using the `POST ai/text_gen` endpoint. This endpoint is using the OpenAI 3.5 turbo model by default. + +```sh +curl -i -L POST "https://api.box.com/2.0/ai/text_gen" \ + -H "content-type: application/json" \ + -H "authorization: Bearer TOKEN" \ + -d '{ + "prompt": "Write a short post about Box AI for documents.Make it highlight the benefits of the solution. You can add some emoticons.", + "items": [ + { + "id": "123467890", + "type": "file" + } + ] + } +``` + +The response is as follows: + +```sh +{ + "answer": "🌟 Exciting News! 🌟\n\nIntroducing Box AI for documents - your new best friend in creating smarter, more efficient content! 🤖💡\n\n🔹 Say goodbye to manual searching and organizing - Box AI does it all for you!\n🔹 Enjoy lightning-fast document analysis and categorization.\n🔹 Boost productivity with automated suggestions and smart recommendations.\n🔹 Collaborate seamlessly with real-time insights and intelligent tagging.\n\nExperience the future of document creation with Box AI - making work easier, faster, and more fun! 🚀💻 #BoxAI #SmartDocuments", + "created_at": "2024-10-08T01:19:06.22-07:00", + "completion_reason": "done" +} +``` + +Let's change the model using the `ai_agent` configuration: + +```sh +curl -i -L POST "https://api.box.com/2.0/ai/text_gen" \ + -H "content-type: application/json" \ + -H "authorization: Bearer TOKEN" \ + -d '{ + "prompt": "Write a short post about Box AI for documents.Make it highlight the benefits of the solution. You can add some emoticons.", + "items": [ + { + "id": "123467890", + "type": "file" + } + ], + "ai_agent": { + "type": "ai_agent_text_gen", + "basic_gen": { + "model": "openai__gpt_4o_2024_05_13" + } + } + } + +``` + +After the model switch, the response is slightly different: + +```sh +{ + "answer": "🚀 **Boost Your Productivity with Box AI for Documents!** 📄✨\n\nSay goodbye to tedious document creation and editing! With Box AI, you can streamline your workflow and focus on what truly matters. Here’s why you’ll love it:\n\n1. **Smart Suggestions** 🤖: Get real-time recommendations to enhance your content.\n2. **Automated Formatting** 📝: Ensure consistency across all your documents effortlessly.\n3. **Collaboration Made Easy** 👥: Work seamlessly with your team, no matter where they are.\n4. **Time-Saving Templates** ⏳: Use pre-built templates to speed up document creation.\n5. **Enhanced Accuracy** ✅: Reduce errors with intelligent proofreading.\n\nTransform the way you work with documents and experience a new level of efficiency with Box AI! 🌟", + "created_at": "2024-10-08T01:28:36.777-07:00", + "completion_reason": "done" +} +``` + +As you can see the responses differ to some extent. Thanks to the model switch, you can optimize your interaction with Box AI and choose the most suitable model for your needs. + +## Use case: Metadata extraction + +Switching models can also give us different results for metadata extraction. +Let's use a sample contract to extract the metadata. In this example, the model used is Google Gemini. + +```sh +curl -i -L 'https://api.box.com/2.0/ai/extract' \ + -H 'content-type: application/json' \ + -H 'authorization: Bearer TOKEN' \ + -d '{ + "prompt": "Extract any data that would be good metadata to save for future contracts.", + "items": [ + { + "type": "file", + "id": "123456789" + } + ] + }' +``` + +The response is a set of metadata: + +```sh +{ + "answer": "{\"Buyer Legal Entity Name\": \"Acme Retail Corp.\", \"Supplier Legal Entity Name\": \"Acme Manufacturing Inc.\", \"Buyer Contact Person\": \"Jane Doe\", \"Supplier Contact Person\": \"Eva Smith\", \"Payment Term\": \"payment in full before pickup of goods\", \"Invoice Currency\": \"Euro\", \"Incoterm\": \"FCA Amsterdam\", \"Governing Law\": \"laws state jurisdiction in which supplier is located\", \"Effective Date\": \"March 27, 2024\", \"Buyer Signature Date\": \"March 28th, 2024\", \"Supplier Signature Date\": \"March 28th, 2024\"}", + "created_at": "2024-10-08T01:53:14.993-07:00", + "completion_reason": "done" +} +``` + +Let's change the model to the most recent OpenAI option: + +```sh +curl -i -L 'https://api.box.com/2.0/ai/extract' \ + -H 'content-type: application/json' \ + -H 'authorization: Bearer TOKEN' \ + -d '{ + "prompt": "Extract any data that would be good metadata to save for future contracts.", + "items": [ + { + "type": "file", + "id": "123456789" + } + ], + "ai_agent": { + "type": "ai_agent_extract", + "basic_text": { + "model": "openai__gpt_4o_2024_05_13" + } + } + }' +``` + +Using this model results in a response listing more metadata entries: + +```sh +{ + "answer": "{\"Effective Date\": \"March 27, 2024\", \"Supplier Legal Entity Name\": \"Acme Manufacturing Inc.\", \"Supplier Registered Office Address\": \"123 Main Street\", \"Supplier Contact Person(s)\": \"Eva Smith\", \"Buyer Legal Entity Name\": \"Acme Retail Corp.\", \"Buyer Registered Office Address\": \"456 Market Avenue\", \"Buyer Contact Person(s)\": \"Jane Doe\", \"Incoterm\": \"FCA Amsterdam\", \"Payment Term\": \"payment in full before pickup of goods\", \"Invoice Currency\": \"Euro\", \"Buyer Printed Name\": \"Jane Doe\", \"Buyer Date\": \"March 28th, 2024\", \"Buyer Title / Position\": \"CEO\", \"Seller Printed Name\": \"Eve Smith\", \"Seller Date\": \"March 28th, 2024\", \"Seller Title / Position\": \"Sales Manager\"}", + "created_at": "2024-10-08T01:54:28.099-07:00", + "completion_reason": "done" +} +``` + +[ask]: e://post_ai_ask#param_ai_agent +[text-gen]: e://post_ai_text_gen#param_ai_agent +[extract]: e://post_ai_extract#param_ai_agent +[extract-structured]: e://post_ai_extract_structured#param_ai_agent +[google-params]: r://ai-llm-endpoint-params-google +[openai-params]: r://ai-llm-endpoint-params-openai +[openai-tokens]: https://help.openai.com/en/articles/4936856-what-are-tokens-and-how-to-count-them +[agent]: e://get_ai_agent_default +[google-temp]: https://ai.google.dev/gemini-api/docs/models/generative-models#model-parameters +[openai-temp]: https://community.openai.com/t/temperature-top-p-and-top-k-for-chatbot-responses/295542 \ No newline at end of file diff --git a/content/guides/box-ai/ask-questions.md b/content/guides/box-ai/ask-questions.md index ae8ee286e..c76937962 100644 --- a/content/guides/box-ai/ask-questions.md +++ b/content/guides/box-ai/ask-questions.md @@ -6,6 +6,7 @@ related_guides: - box-ai/prerequisites - box-ai/generate-text - box-ai/ai-agents/get-agent-default-config + - box-ai/ai-agents/overrides-tutorial --- # Ask questions to Box AI @@ -52,9 +53,10 @@ Mandatory parameters are in **bold**. |**`items.id`** | The Box file ID you want to provide as input. | | `112233445566`| | **`items.type`** | The type of the provided input. Currently, it can be a single file or multiple files. | `file` | `file` | | `items.content` | The content of the item, often the text representation. | | `An application programming interface (API) is a way for two or more computer programs or components to communicate with each other. It is a type of software interface...` | -|`ai_agent` | The AI agent used to override the default agent configuration. You can use this parameter replace the default LLM with a custom one using the [`model`][model-param] parameter for shorter and longer texts, tweak the base [`prompt`][prompt-param] to allow for a more customized user experience, or change an LLM parameter, such as `temperature`, to make the results more or less creative. Before you use the `ai_agent` parameter, you can get the default configuration using the [`GET 2.0/ai_agent_default`][agent] request.||| +|`ai_agent` | The AI agent used to override the default agent configuration. You can use this parameter replace the default LLM with a custom one using the [`model`][model-param] parameter for shorter and longer texts, tweak the base [`prompt`][prompt-param] to allow for a more customized user experience, or change an LLM parameter, such as `temperature`, to make the results more or less creative. Before you use the `ai_agent` parameter, you can get the default configuration using the [`GET 2.0/ai_agent_default`][agent] request. For specific use cases, see the [AI model overrides tutorial][overrides]. || [prereq]: g://box-ai/prerequisites [agent]: e://get_ai_agent_default [model-param]: r://ai_agent_ask#param_basic_text_model -[prompt-param]: e://ai_agent_ask#param_basic_text_prompt_template \ No newline at end of file +[prompt-param]: e://ai_agent_ask#param_basic_text_prompt_template +[overrides]: g://box-ai/ai-agents/overrides-tutorial \ No newline at end of file diff --git a/content/guides/box-ai/extract-metadata-structured.md b/content/guides/box-ai/extract-metadata-structured.md index 514b71729..51f21b5c0 100644 --- a/content/guides/box-ai/extract-metadata-structured.md +++ b/content/guides/box-ai/extract-metadata-structured.md @@ -6,6 +6,7 @@ related_guides: - box-ai/prerequisites - box-ai/extract-metadata - box-ai/ai-agents/get-agent-default-config + - box-ai/ai-agents/overrides-tutorial --- # Extract metadata from file (structured) @@ -55,7 +56,7 @@ The `items` array can have exactly one element. | `fields.options` | A list of options for this field. This is most often used in combination with the `enum` and `multiSelect` field types. | `[{"key":"First Name"},{"key":"Last Name"}]` | | `fields.options.key` | A unique identifier for the field. | `First Name` | | `fields.prompt` | Additional context about the key (identifier) that may include how to find and format it. | `Name is the first and last name from the email address` | -| `ai_agent` | The AI agent used to override the default agent configuration. This parameter allows you to, for example, replace the default LLM with a custom one using the [`model`][model-param] parameter, tweak the base [`prompt`][prompt-param] to allow for a more customized user experience, or change an LLM parameter, such as `temperature`, to make the results more or less creative. Before using the `ai_agent` parameter, you can get the default configuration using the [`GET 2.0/ai_agent_default`][agent] request. | | +| `ai_agent` | The AI agent used to override the default agent configuration. This parameter allows you to, for example, replace the default LLM with a custom one using the [`model`][model-param] parameter, tweak the base [`prompt`][prompt-param] to allow for a more customized user experience, or change an LLM parameter, such as `temperature`, to make the results more or less creative. Before you use the `ai_agent` parameter, you can get the default configuration using the [`GET 2.0/ai_agent_default`][agent] request. For specific use cases, see the [AI model overrides tutorial][overrides]. | | ## Use case @@ -180,3 +181,4 @@ The response lists the fields included in the metadata template and their values [prompt-param]: r://ai_agent_text_gen#param_basic_gen_prompt_template [templates-console]: https://support.box.com/hc/en-us/articles/360044194033-Customizing-Metadata-Templates [templates-api]: g://metadata/templates/create +[overrides]: g://box-ai/ai-agents/overrides-tutorial \ No newline at end of file diff --git a/content/guides/box-ai/extract-metadata.md b/content/guides/box-ai/extract-metadata.md index 65ed52d59..680cf2d06 100644 --- a/content/guides/box-ai/extract-metadata.md +++ b/content/guides/box-ai/extract-metadata.md @@ -43,10 +43,7 @@ The `items` array can have exactly one element. |**`items.id`**|Box file ID of the document. The ID must reference an actual file with an extension. |`1233039227512`| |**`items.type`**|The type of the supplied input. | `file`| | `items.content` | The content of the item, often the text representation. | `This article is about Box AI`. | -| `dialogue_history.prompt` | The prompt previously provided by the client and answered by the Large Language Model (LLM). | `Make my email about public APIs sound more professional` | -| `dialogue_history.answer` | The answer previously provided by the LLM. | `Here is a draft of your professional email about public APIs.` | -| `dialogue_history.created_at` | The ISO date formatted timestamp of when the previous answer to the prompt was created. | `2012-12-12T10:53:43-08:00` | -|`ai_agent` | The AI agent used to override the default agent configuration. This parameter allows you to, for example, replace the default LLM with a custom one using the [`model`][model-param] parameter, tweak the base [`prompt`][prompt-param] to allow for a more customized user experience, or change an LLM parameter, such as `temperature`, to make the results more or less creative. Before using the `ai_agent` parameter, you can get the default configuration using the [`GET 2.0/ai_agent_default`][agent] request.| | +|`ai_agent` | The AI agent used to override the default agent configuration. This parameter allows you to, for example, replace the default LLM with a custom one using the [`model`][model-param] parameter, tweak the base [`prompt`][prompt-param] to allow for a more customized user experience, or change an LLM parameter, such as `temperature`, to make the results more or less creative. Before you use the `ai_agent` parameter, you can get the default configuration using the [`GET 2.0/ai_agent_default`][agent] request. For specific use cases, see the [AI model overrides tutorial][overrides].| | ## Use case @@ -155,4 +152,5 @@ In such a case, the response will be based on the keywords included in the query [prereq]: g://box-ai/prerequisites [agent]: e://get_ai_agent_default [model-param]: r://ai_agent_text_gen#param_basic_gen_model -[prompt-param]: r://ai_agent_text_gen#param_basic_gen_prompt_template \ No newline at end of file +[prompt-param]: r://ai_agent_text_gen#param_basic_gen_prompt_template +[overrides]: g://box-ai/ai-agents/overrides-tutorial \ No newline at end of file diff --git a/content/guides/box-ai/generate-text.md b/content/guides/box-ai/generate-text.md index bf5645ca7..45bb1eaf0 100644 --- a/content/guides/box-ai/generate-text.md +++ b/content/guides/box-ai/generate-text.md @@ -48,9 +48,10 @@ To make a call, you must pass the following parameters. Mandatory parameters are | `dialogue_history.prompt` | The prompt previously provided by the client and answered by the Large Language Model (LLM). | `Make my email about public APIs sound more professional` | | `dialogue_history.answer` | The answer previously provided by the LLM. | `Here is a draft of your professional email about public APIs.` | | `dialogue_history.created_at` | The ISO date formatted timestamp of when the previous answer to the prompt was created. | `2012-12-12T10:53:43-08:00` | -|`ai_agent` | The AI agent used to override the default agent configuration. This parameter allows you to, for example, replace the default LLM with a custom one using the [`model`][model-param] parameter, tweak the base [`prompt`][prompt-param] to allow for a more customized user experience, or change an LLM parameter, such as `temperature`, to make the results more or less creative. Before using the `ai_agent` parameter, you can get the default configuration using the [`GET 2.0/ai_agent_default`][agent] request.| | +|`ai_agent` | The AI agent used to override the default agent configuration. This parameter allows you to, for example, replace the default LLM with a custom one using the [`model`][model-param] parameter, tweak the base [`prompt`][prompt-param] to allow for a more customized user experience, or change an LLM parameter, such as `temperature`, to make the results more or less creative. Before you use the `ai_agent` parameter, you can get the default configuration using the [`GET 2.0/ai_agent_default`][agent] request. For specific use cases, see the [AI model overrides tutorial][overrides]| | [prereq]: g://box-ai/prerequisites [agent]: e://get_ai_agent_default [model-param]: r://ai_agent_text_gen#param_basic_gen_model -[prompt-param]: r://ai_agent_text_gen#param_basic_gen_prompt_template \ No newline at end of file +[prompt-param]: r://ai_agent_text_gen#param_basic_gen_prompt_template +[overrides]: g://box-ai/ai-agents/overrides-tutorial \ No newline at end of file From 2d0e7133906c79e66b65b9b066e6b385cb65a2ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Barbara=20Czy=C5=BC?= Date: Tue, 15 Oct 2024 11:53:38 +0200 Subject: [PATCH 07/13] Link guide to collaborations api (#616) --- content/guides/api-calls/pagination/marker-based.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/guides/api-calls/pagination/marker-based.md b/content/guides/api-calls/pagination/marker-based.md index 09260a232..4bd903448 100644 --- a/content/guides/api-calls/pagination/marker-based.md +++ b/content/guides/api-calls/pagination/marker-based.md @@ -3,6 +3,7 @@ rank: 2 related_endpoints: - get_folders_id_items - get_files_id_collaborations + - get-folders-id-collaborations - get_webhooks - get_metadata_templates_enterprise - get_recent_items From ea1a4e4aae886d6771f17d3e437dd5f465fc070e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Barbara=20Czy=C5=BC?= Date: Tue, 15 Oct 2024 16:34:01 +0200 Subject: [PATCH 08/13] Fix pagination link (#617) --- content/guides/api-calls/pagination/marker-based.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/guides/api-calls/pagination/marker-based.md b/content/guides/api-calls/pagination/marker-based.md index 4bd903448..bea3c95b0 100644 --- a/content/guides/api-calls/pagination/marker-based.md +++ b/content/guides/api-calls/pagination/marker-based.md @@ -3,7 +3,7 @@ rank: 2 related_endpoints: - get_folders_id_items - get_files_id_collaborations - - get-folders-id-collaborations + - get_folders_id_collaborations - get_webhooks - get_metadata_templates_enterprise - get_recent_items From 9bd899b27541275239232b275d3b3018ee96bfd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Barbara=20Czy=C5=BC?= Date: Tue, 22 Oct 2024 19:26:02 +0200 Subject: [PATCH 09/13] Documentation for AI GA (#618) * prepare documentation for AI GA * minor fix * fix UAR section * Add historical agent config * review updates * update JSON * Remove openAI models * Remove AWS, update BUIE * Legal review --- .spelling | 3 +- .../api-calls/api-versioning-strategy.md | 4 + .../box-ai/ai-agents/ai-agent-versioning.md | 212 +++++++++ .../ai-agents/get-agent-default-config.md | 5 +- content/guides/box-ai/ai-agents/index.md | 4 + .../box-ai/ai-agents/overrides-tutorial.md | 3 +- content/guides/box-ai/ask-questions.md | 2 +- .../box-ai/extract-metadata-structured.md | 2 +- content/guides/box-ai/extract-metadata.md | 2 +- content/guides/box-ai/generate-text.md | 2 +- content/guides/box-ai/index.md | 18 +- content/guides/box-ai/prerequisites.md | 2 +- content/guides/box-ai/supported-models.md | 13 +- .../ui-elements/images/box-ai-ui-element.jpg | Bin 0 -> 71915 bytes content/guides/embed/ui-elements/preview.md | 420 +++++++++++------- package.json | 2 +- 16 files changed, 489 insertions(+), 205 deletions(-) create mode 100644 content/guides/box-ai/ai-agents/ai-agent-versioning.md create mode 100644 content/guides/embed/ui-elements/images/box-ai-ui-element.jpg diff --git a/.spelling b/.spelling index 91e9cd342..2a8391790 100644 --- a/.spelling +++ b/.spelling @@ -315,4 +315,5 @@ GPT-3 freeform pre-defined stringified -params \ No newline at end of file +params +GPT-4o-mini \ No newline at end of file diff --git a/content/guides/api-calls/api-versioning-strategy.md b/content/guides/api-calls/api-versioning-strategy.md index 6bac397a5..22b48fcbf 100644 --- a/content/guides/api-calls/api-versioning-strategy.md +++ b/content/guides/api-calls/api-versioning-strategy.md @@ -214,6 +214,10 @@ Breaking changes in the Box API occur within versioned releases, typically accom We use [oasdiff](https://github.com/Tufin/oasdiff/blob/main/BREAKING-CHANGES-EXAMPLES.md) tool to detect most of the possible breaking changes. +## AI agent configuration versioning + +[AI agent](g://box-ai/ai-agents) versioning gives the developers more control over model version management and ensures consistent responses. For details, see [AI agent configuration versioning guide](g://box-ai/ai-agents/ai-agent-versioning). + ## Support policy and deprecation information When new versions of the Box APIs and Box SDKs are released, earlier versions will be retired. Box marks a version as `deprecated` at least 24 months before retiring it. In other words, a deprecated version cannot become end-of-life diff --git a/content/guides/box-ai/ai-agents/ai-agent-versioning.md b/content/guides/box-ai/ai-agents/ai-agent-versioning.md new file mode 100644 index 000000000..5e0e8b30e --- /dev/null +++ b/content/guides/box-ai/ai-agents/ai-agent-versioning.md @@ -0,0 +1,212 @@ +--- +rank: 4 +related_endpoints: + - get_ai_agent_default + - post_ai_text_gen + - post_ai_ask +related_guides: + - box-ai/prerequisites + - box-ai/ask-questions + - box-ai/generate-text + - box-ai/extract-metadata + - box-ai/extract-metadata-structured +--- + +# AI agent configuration versioning + + +Box updates the default models across the endpoints on a regular basis in order to stay up to date with the most advanced options. If a default model is updated, it will be posted in the developer changelog. + + + +AI agent configuration versioning gives the developers more control over AI agent versioning and ensures consistent responses. + +AI agent configuration versioning adopts the following principles: + +* Each AI agent snapshot is supported for at least 12 months, unless there are factors outside of Box's control. For example, a Large Language Model (LLM) may get deprecated. +* An AI agent snapshot is available unless a new, stable agent version is released +* A 6-month window is provided to test and transition to the new snapshot. + +## Historical AI agent configuration + +The values in the [default agent configuration][default-config] used by the LLM gateway often change to achieve the best possible answer quality. + +To make sure your configurations are not affected in a negative way, you can use the historical AI agent configuration provided below to [override the default one][overrides]. + +```json +{ + "ask": { + "type": "ai_agent_ask", + "longText": { + "model": "azure__openai__gpt_4o_mini", + "systemMessage": "", + "promptTemplate": "Reply as if it's {current_date}.\nI will ask you for help and provide subsections of one document delimited by five backticks (`````) at the beginning and at the end.\nIf I make a reference to \"this\", I am referring to the document I provided between the five backticks. I may ask you a question where the answer is contained within the document. In that case, do your best to answer using only the document, but if you cannot, feel free to mention that you couldn't find an answer in the document, but you have some answer from your general knowledge.\nI may ask you to perform some kind of computation or symbol manipulation such as filtering a list, counting something, summing, averaging, and other aggregation/grouping functions or some combination of them. In these cases, first list the plan of how you plan to perform such a computation, then follow that plan step by step, keeping track of intermediate results, and at the end tell me the final answer.\nI may ask you to enumerate or somehow list people, places, characters, or other important things from the document, if I do so, please only use the document provided to list them.\nTEXT FROM DOCUMENT STARTS\n`````\n{content}\n`````\nTEXT FROM DOCUMENT ENDS\nNever mention five backticks in your response. Unless you are told otherwise, a one paragraph response is sufficient for any requested summarization tasks.\nHere is how I need help from you: {user_question}", + "numTokensForCompletion": 6000, + "llmEndpointParams": { + "type": "openai_params", + "temperature": 0.0, + "topP": 1.0, + "frequencyPenalty": 0.0, + "presencePenalty": 1.5, + "stop": "<|im_end|>" + }, + "embeddings": { + "model": "azure__openai__text_embedding_ada_002", + "strategy": { + "id": "basic", + "numTokensPerChunk": 64 + } + } + }, + "basicText": { + "model": "azure__openai__gpt_4o_mini", + "systemMessage": "", + "promptTemplate": "Reply as if it's {current_date}.\nI will ask you for help and provide the entire text of one document delimited by five backticks (`````) at the beginning and at the end.\nIf I make a reference to \"this\", I am referring to the document I provided between the five backticks. I may ask you a question where the answer is contained within the document. In that case, do your best to answer using only the document, but if you cannot, feel free to mention that you couldn't find an answer in the document, but you have some answer from your general knowledge.\nI may ask you to perform some kind of computation or symbol manipulation such as filtering a list, counting something, summing, averaging, and other aggregation/grouping functions or some combination of them. In these cases, first list the plan of how you plan to perform such a computation, then follow that plan step by step, keeping track of intermediate results, and at the end tell me the final answer.\nI may ask you to enumerate or somehow list people, places, characters, or other important things from the document, if I do so, please only use the document provided to list them.\nTEXT FROM DOCUMENT STARTS\n`````\n{content}\n`````\nTEXT FROM DOCUMENT ENDS\nNever mention five backticks in your response. Unless you are told otherwise, a one paragraph response is sufficient for any requested summarization tasks.\nHere is how I need help from you: {user_question}", + "numTokensForCompletion": 6000, + "llmEndpointParams": { + "type": "openai_params", + "temperature": 0.0, + "topP": 1.0, + "frequencyPenalty": 0.0, + "presencePenalty": 1.5, + "stop": "<|im_end|>" + } + }, + "longTextMulti": { + "model": "azure__openai__gpt_4o_mini", + "systemMessage": "Role and Goal: You are an assistant designed to analyze and answer a question based on provided snippets from multiple documents, which can include business-oriented documents like docs, presentations, PDFs, etc. The assistant will respond concisely, using only the information from the provided documents.\n\nConstraints: The assistant should avoid engaging in chatty or extensive conversational interactions and focus on providing direct answers. It should also avoid making assumptions or inferences not supported by the provided document snippets.\n\nGuidelines: When answering, the assistant should consider the file's name and path to assess relevance to the question. In cases of conflicting information from multiple documents, it should list the different answers with citations. For summarization or comparison tasks, it should concisely answer with the key points. It should also consider the current date to be the date given.\n\nPersonalization: The assistant's tone should be formal and to-the-point, suitable for handling business-related documents and queries.\n", + "promptTemplate": "Current date: {current_date}\n\nTEXT FROM DOCUMENTS STARTS\n{content}\nTEXT FROM DOCUMENTS ENDS\n\nHere is how I need help from you: {user_question}\n.", + "numTokensForCompletion": 6000, + "llmEndpointParams": { + "type": "openai_params", + "temperature": 0.0, + "topP": 1.0, + "frequencyPenalty": 0.0, + "presencePenalty": 1.5, + "stop": "<|im_end|>" + }, + "embeddings": { + "model": "azure__openai__text_embedding_ada_002", + "strategy": { + "id": "basic", + "numTokensPerChunk": 64 + } + } + }, + "basicTextMulti": { + "model": "azure__openai__gpt_4o_mini", + "systemMessage": "", + "promptTemplate": "Current date: {current_date}\n\nTEXT FROM DOCUMENTS STARTS\n{content}\nTEXT FROM DOCUMENTS ENDS\n\nHere is how I need help from you: {user_question}\n.", + "numTokensForCompletion": 6000, + "llmEndpointParams": { + "type": "openai_params", + "temperature": 0.0, + "topP": 1.0, + "frequencyPenalty": 0.0, + "presencePenalty": 1.5, + "stop": "<|im_end|>" + } + }, + }, + "extract": { + "type": "ai_agent_extract", + "longText": { + "model": "google__gemini_1_5_flash_001", + "systemMessage": "Respond only in valid json. You are extracting metadata that is name, value pairs from a document. Only output the metadata in valid json form, as {\"name1\":\"value1\",\"name2\":\"value2\"} and nothing else. You will be given the document data and the schema for the metadata, that defines the name, description and type of each of the fields you will be extracting. Schema is of the form {\"fields\": [{\"key\": \"key_name\", \"displayName\": \"key display name\", \"type\": \"string\", \"description\": \"key description\"}]}. Leverage key description and key display name to identify where the key and value pairs are in the document. In certain cases, key description can also indicate the instructions to perform on the document to obtain the value. Prompt will be in the form of Schema is ``schema`` \n document is ````document````", + "promptTemplate": "If you need to know today's date to respond, it is {current_date}. Schema is ``{user_question}`` \n document is ````{content}````", + "numTokensForCompletion": 4096, + "llmEndpointParams": { + "type": "google_params", + "temperature": 0.0, + "topP": 1.0, + "frequencyPenalty": 0.0, + "presencePenalty": 0.0 + }, + "embeddings": { + "model": "azure__openai__text_embedding_ada_002", + "strategy": { + "id": "basic", + "numTokensPerChunk": 64 + } + } + }, + "basicText": { + "model": "google__gemini_1_5_flash_001", + "systemMessage": "Respond only in valid json. You are extracting metadata that is name, value pairs from a document. Only output the metadata in valid json form, as {\"name1\":\"value1\",\"name2\":\"value2\"} and nothing else. You will be given the document data and the schema for the metadata, that defines the name, description and type of each of the fields you will be extracting. Schema is of the form {\"fields\": [{\"key\": \"key_name\", \"displayName\": \"key display name\", \"type\": \"string\", \"description\": \"key description\"}]}. Leverage key description and key display name to identify where the key and value pairs are in the document. In certain cases, key description can also indicate the instructions to perform on the document to obtain the value. Prompt will be in the form of Schema is ``schema`` \n document is ````document````", + "promptTemplate": "If you need to know today's date to respond, it is {current_date}. Schema is ``{user_question}`` \n document is ````{content}````", + "numTokensForCompletion": 4096, + "llmEndpointParams": { + "type": "google_params", + "temperature": 0.0, + "topP": 1.0, + "frequencyPenalty": 0.0, + "presencePenalty": 0.0 + } + } + }, + "textGen": { + "type": "ai_agent_text_gen", + "basicGen": { + "model": "azure__openai__gpt_3_5_turbo_16k", + "systemMessage": "\nIf you need to know today's date to respond, it is {current_date}.\nThe user is working in a collaborative document creation editor called Box Notes.\nAssume that you are helping a business user create documents or to help the user revise existing text.\nYou can help the user in creating templates to be reused or update existing documents, you can respond with text that the user can use to place in the document that the user is editing.\nIf the user simply asks to \"improve\" the text, then simplify the language and remove jargon, unless the user specifies otherwise.\nDo not open with a preamble to the response, just respond.\n", + "promptTemplate": "{user_question}", + "numTokensForCompletion": 12000, + "llmEndpointParams": { + "type": "openai_params", + "temperature": 0.1, + "topP": 1.0, + "frequencyPenalty": 0.75, + "presencePenalty": 0.75, + "stop": "<|im_end|>" + }, + "embeddings": { + "model": "azure__openai__text_embedding_ada_002", + "strategy": { + "id": "basic", + "numTokensPerChunk": 64 + } + }, + "contentTemplate": "`````{content}`````" + } + }, + "extractStructured": { + "type": "ai_agent_extract_structured", + "longText": { + "model": "google__gemini_1_5_flash_001", + "systemMessage": "Respond only in valid json. You are extracting metadata that is name, value pairs from a document. Only output the metadata in valid json form, as {\"name1\":\"value1\",\"name2\":\"value2\"} and nothing else. You will be given the document data and the schema for the metadata, that defines the name, description and type of each of the fields you will be extracting. Schema is of the form {\"fields\": [{\"key\": \"key_name\", \"prompt\": \"prompt to extract the value\", \"type\": \"date\"}]}. Leverage prompt for each key to identify where the key and value pairs are in the document. In certain cases, prompt can also indicate the instructions to perform on the document to obtain the value. Prompt will be in the form of Schema is ``schema`` \n document is ````document````", + "promptTemplate": "If you need to know today's date to respond, it is {current_date}. Schema is ``{user_question}`` \n document is ````{content}````", + "numTokensForCompletion": 4096, + "llmEndpointParams": { + "type": "google_params", + "temperature": 0.0, + "topP": 1.0, + "frequencyPenalty": 0.0, + "presencePenalty": 0.0 + }, + "embeddings": { + "model": "google__textembedding_gecko_003", + "strategy": { + "id": "basic", + "numTokensPerChunk": 64 + } + } + }, + "basicText": { + "model": "google__gemini_1_5_flash_001", + "systemMessage": "Respond only in valid json. You are extracting metadata that is name, value pairs from a document. Only output the metadata in valid json form, as {\"name1\":\"value1\",\"name2\":\"value2\"} and nothing else. You will be given the document data and the schema for the metadata, that defines the name, description and type of each of the fields you will be extracting. Schema is of the form {\"fields\": [{\"key\": \"key_name\", \"prompt\": \"prompt to extract the value\", \"type\": \"date\"}]}. Leverage prompt for each key to identify where the key and value pairs are in the document. In certain cases, prompt can also indicate the instructions to perform on the document to obtain the value. Prompt will be in the form of Schema is ``schema`` \n document is ````document````", + "promptTemplate": "If you need to know today's date to respond, it is {current_date}. Schema is ``{user_question}`` \n document is ````{content}````", + "numTokensForCompletion": 4096, + "llmEndpointParams": { + "type": "google_params", + "temperature": 0.0, + "topP": 1.0, + "frequencyPenalty": 0.0, + "presencePenalty": 0.0 + } + } + } +} +``` + +[default-config]: g://box-ai/ai-agents/get-agent-default-config +[overrides]: g://box-ai/ai-agents/overrides-tutorial \ No newline at end of file diff --git a/content/guides/box-ai/ai-agents/get-agent-default-config.md b/content/guides/box-ai/ai-agents/get-agent-default-config.md index 8e0d16696..90e1b1435 100644 --- a/content/guides/box-ai/ai-agents/get-agent-default-config.md +++ b/content/guides/box-ai/ai-agents/get-agent-default-config.md @@ -8,13 +8,14 @@ related_guides: - box-ai/prerequisites - box-ai/ask-questions - box-ai/generate-text + - box-ai/extract-metadata + - box-ai/extract-metadata-structured --- # Get default AI agent configuration -Box AI API is currently a beta feature offered subject to Box’s Main Beta Agreement, and the available capabilities may change. Box AI API is available to all Enterprise Plus customers. - +Endpoints related to metadata extraction are currently a beta feature offered subject to Box’s Main Beta Agreement, and the available capabilities may change. Box AI API is available to all Enterprise Plus customers. The `GET /2.0/ai_agent_default` endpoint allows you to fetch the default configuration for AI services. diff --git a/content/guides/box-ai/ai-agents/index.md b/content/guides/box-ai/ai-agents/index.md index 6ae9ec0c4..feac76560 100644 --- a/content/guides/box-ai/ai-agents/index.md +++ b/content/guides/box-ai/ai-agents/index.md @@ -13,6 +13,10 @@ related_guides: # AI model overrides + +Endpoints related to metadata extraction are currently a beta feature offered subject to Box’s Main Beta Agreement, and the available capabilities may change. Box AI API is available to all Enterprise Plus customers. + + Box updates the default models across the endpoints on a regular basis to stay up to date with the most advanced options. If your implementation is based on Box AI, a new default model might alter the results in a way that could break or change a downstream process. Switching to a specific version may prevent encountering any issues. diff --git a/content/guides/box-ai/ai-agents/overrides-tutorial.md b/content/guides/box-ai/ai-agents/overrides-tutorial.md index e60ec7a1d..ec6319b93 100644 --- a/content/guides/box-ai/ai-agents/overrides-tutorial.md +++ b/content/guides/box-ai/ai-agents/overrides-tutorial.md @@ -13,8 +13,7 @@ related_guides: # Override AI model configuration -Box AI API is currently a beta feature offered subject to Box’s Main Beta Agreement, and the available capabilities may change. Box AI API is available to all Enterprise Plus customers. - +Endpoints related to metadata extraction are currently a beta feature offered subject to Box’s Main Beta Agreement, and the available capabilities may change. Box AI API is available to all Enterprise Plus customers. The `agent_ai` configuration allows you to override the default AI model configuration. It is available for the following endpoints: diff --git a/content/guides/box-ai/ask-questions.md b/content/guides/box-ai/ask-questions.md index c76937962..6ba77746a 100644 --- a/content/guides/box-ai/ask-questions.md +++ b/content/guides/box-ai/ask-questions.md @@ -12,7 +12,7 @@ related_guides: # Ask questions to Box AI -Box AI API is currently a beta feature offered subject to Box’s Main Beta Agreement, and the available capabilities may change. Box AI API is available to all Enterprise Plus customers. +Box AI API is available to all Enterprise Plus customers. diff --git a/content/guides/box-ai/extract-metadata-structured.md b/content/guides/box-ai/extract-metadata-structured.md index 51f21b5c0..66a3d05cb 100644 --- a/content/guides/box-ai/extract-metadata-structured.md +++ b/content/guides/box-ai/extract-metadata-structured.md @@ -12,7 +12,7 @@ related_guides: # Extract metadata from file (structured) -Box AI API is currently a beta feature offered subject to Box’s Main Beta Agreement, and the available capabilities may change. Box AI API is available to all Enterprise Plus customers. +Endpoints related to metadata extraction are currently a beta feature offered subject to Box’s Main Beta Agreement, and the available capabilities may change. Box AI API is available to all Enterprise Plus customers. diff --git a/content/guides/box-ai/extract-metadata.md b/content/guides/box-ai/extract-metadata.md index 680cf2d06..14d19cddd 100644 --- a/content/guides/box-ai/extract-metadata.md +++ b/content/guides/box-ai/extract-metadata.md @@ -10,7 +10,7 @@ related_guides: # Extract metadata from file (freeform) -Box AI API is currently a beta feature offered subject to Box’s Main Beta Agreement, and the available capabilities may change. Box AI API is available to all Enterprise Plus customers. +Endpoints related to metadata extraction are currently a beta feature offered subject to Box’s Main Beta Agreement, and the available capabilities may change. Box AI API is available to all Enterprise Plus customers. diff --git a/content/guides/box-ai/generate-text.md b/content/guides/box-ai/generate-text.md index 45bb1eaf0..420320692 100644 --- a/content/guides/box-ai/generate-text.md +++ b/content/guides/box-ai/generate-text.md @@ -10,7 +10,7 @@ related_guides: # Generate text with Box AI -Box AI API is currently a beta feature offered subject to Box’s Main Beta Agreement, and the available capabilities may change. Box AI API is available to all Enterprise Plus customers. +Box AI API is available to all Enterprise Plus customers. diff --git a/content/guides/box-ai/index.md b/content/guides/box-ai/index.md index a1130031b..fffea15dd 100644 --- a/content/guides/box-ai/index.md +++ b/content/guides/box-ai/index.md @@ -14,7 +14,7 @@ related_guides: # Box AI -Box AI API is currently a beta feature offered subject to Box’s Main Beta Agreement, and the available capabilities may change. Box AI API is available to all Enterprise Plus customers. +Endpoints related to metadata extraction are currently a beta feature offered subject to Box’s Main Beta Agreement, and the available capabilities may change. Box AI API is available to all Enterprise Plus customers. Box AI API allows you to use Box AI @@ -82,7 +82,7 @@ The [`POST /2.0/ai/extract`][extract] and [`POST /2.0/ai/extract_structured`][ex ### Configuration overrides -You can use the `ai_agent` parameter available in the [`POST /2.0/ai/ask`][ask] and [`POST /2.0/ai/text_gen`][text-gen] requests to override the default agent configuration and introduce your own custom settings. +You can use the `ai_agent` parameter available in the Box AI API requests to override the default agent configuration and introduce your own custom settings. For details, see [AI agent default configuration][agent-default]. @@ -117,23 +117,15 @@ better results for this language. ## Box AI API in User Activity Report (UAR) -[User Activity Reports][uar] provide an overview of the -actions the users are taking in Box. Box Admins -use this report to view the actions taken by their -users within a given time period, and this -includes interactions with Box AI. The report -contains the following action types that Box admins can -select to get details for Box AI: +[User Activity Reports][uar] provide an overview of the actions the users are taking in Box. Box Admins use this report to view the actions taken by their users within a given time period, and this includes interactions with Box AI. The report contains the following action types that Box admins can select to get details for Box AI: -* `AI query`: The user queried Box AI and received a response. -* `Failed AI query`: The user queried Box AI but did not receive a response. +* **AI query**: The user queried Box AI and received a response. +* **Failed AI query**: The user queried Box AI but did not receive a response. [boxainotes]: https://support.box.com/hc/en-us/articles/22198577315347-Box-AI-for-Notes [boxaidocs]: https://support.box.com/hc/en-us/articles/22158484213267-Box-AI-for-Documents [boxaielement]: g://embed/ui-elements/preview#box-ai-ui-element [uar]: https://support.box.com/hc/en-us/articles/4415012490387-User-Activity-Report [agent-default]: g://box-ai/ai-agents/get-agent-default-config -[ask]: e://post_ai_ask#param_ai_agent -[text-gen]: e://post_ai_text_gen#param_ai_agent [extract]: e://post_ai_extract [extract-structured]: e://post_ai_extract_structured \ No newline at end of file diff --git a/content/guides/box-ai/prerequisites.md b/content/guides/box-ai/prerequisites.md index 17fb0fa9e..6a0bb21a4 100644 --- a/content/guides/box-ai/prerequisites.md +++ b/content/guides/box-ai/prerequisites.md @@ -10,7 +10,7 @@ related_guides: # Get started with Box AI -Box AI API is currently a beta feature offered subject to Box’s Main Beta Agreement, and the available capabilities may change. Box AI API is available to all Enterprise Plus customers. +Endpoints related to metadata extraction are currently a beta feature offered subject to Box’s Main Beta Agreement, and the available capabilities may change. Box AI API is available to all Enterprise Plus customers. To implement Box AI API in your solutions, you need diff --git a/content/guides/box-ai/supported-models.md b/content/guides/box-ai/supported-models.md index 33ac65ac3..368028a3c 100644 --- a/content/guides/box-ai/supported-models.md +++ b/content/guides/box-ai/supported-models.md @@ -8,14 +8,10 @@ related_guides: # Supported AI models - -Box AI API is currently a beta feature offered subject to Box’s Main Beta Agreement, and the available capabilities may change. Box AI API is available to all Enterprise Plus customers. - - The table lists the supported AI models you can use to: - get the [default AI agent configuration][agent], -- override the AI agent configuration used in [`POST 2.0/ai/ask`][ask] and [`POST 2.0/ai/text_gen`][text-gen] endpoints. +- override the AI agent configuration used in the Box AI API endpoints. When using `model` parameter your API calls, use the **API Name** listed in the table. For example, to get the AI agent configuration for a specific model, use the [model][ai-model] parameter and provide the `openai__gpt_3_5_turbo_16k` API name. @@ -30,7 +26,7 @@ may be limited. | Provider | Family |Availability| API Name | External documentation | Capability | | --------------- | ------ |-----| --------------------------------------- | ----------------------------------------------------------------------- | ---------- | | Microsoft Azure | GPT |available| `azure__openai__gpt_3_5_turbo_16k` | [Azure OpenAI GPT-3.5 model documentation][azure-ai-model-gpt35] | Chat | -| Microsoft Azure | GPT |available| `azure__openai__gpt_4o_mini` | [Azure OpenAI GPT-3.5 model documentation][azure-ai-model-gpt40] | Chat | +| Microsoft Azure | GPT |available| `azure__openai__gpt_4o_mini` | [Azure OpenAI GPT-4o-mini model documentation][azure-ai-model-gpt40] | Chat | | Microsoft Azure | GPT |available| `azure__openai__text_embedding_ada_002` | [Azure OpenAI embeddings models documentation][azure-ai-embeddings] | Embeddings | | GCP Vertex | Gecko | available |`google__textembedding_gecko` | [Google Vertex AI embeddings models documentation][vertex-ai-model] | Embeddings | | GCP Vertex | Gecko | available |`google__textembedding_gecko_002` | [Google Vertex AI embeddings model documentation][vertex-ai-model] | Embeddings | @@ -40,11 +36,6 @@ may be limited. | GCP Vertex | PaLM | available |`google__text_unicorn` | [Google PaLM 2 for Text model documentation][vertex-text-models] | Chat | | GCP Vertex | PaLM | available |`google__text_bison` | [Google PaLM 2 for Text model documentation][vertex-text-models] | Chat | | GCP Vertex | PaLM |available| `google__text_bison_32k` | [Google PaLM 2 for Text model documentation][vertex-text-models] | Chat | -| OpenAI | GPT | available in Beta only|`openai__gpt_3_5_turbo_16k` | [OpenAI GPT-3.5 model documentation][openai-gpt-3-5-model] | Chat | -| OpenAI | GPT |available in Beta only| `openai__gpt_4_1106_preview` | [OpenAI GPT-4 models documentation][openai-gpt-4-models] | Chat | -| OpenAI | GPT | available in Beta only|`openai__gpt_4_turbo_preview` | [OpenAI GPT-4 models documentation][openai-gpt-4-models] | Chat | -| OpenAI | GPT | available in Beta only |`openai__gpt_4o_2024_05_13` | [OpenAI GPT-4 models documentation][openai-gpt-4-models] | Chat | -| OpenAI | GPT |available in Beta only| `openai__text_embedding_ada_002` | [Azure OpenAI embeddings models documentation][openai-embeddings] | Embeddings | [ask]: e://post_ai_ask [text-gen]: e://post_ai_text_gen diff --git a/content/guides/embed/ui-elements/images/box-ai-ui-element.jpg b/content/guides/embed/ui-elements/images/box-ai-ui-element.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dcef6b86e331f6bd04f85211fce05b708b3bdbe5 GIT binary patch literal 71915 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 - - + +; ``` The Content Preview Library fetches information @@ -215,18 +215,18 @@ being previewed or a map of typed file IDs to access token for those files. ```js // Example token generator function that resolves to a single access token -var singleTokenGenerator = function() { - return someApi.getToken().then(function(data) { - return data.token; - }); +var singleTokenGenerator = function () { + return someApi.getToken().then(function (data) { + return data.token; + }); }; // Example token generator function that resolves to a map of tokens -var mapTokenGenerator = function() { - return Promise.resolve({ - file_1234: "some_token_abcd", - file_2345: "some_token_bcde" - }); +var mapTokenGenerator = function () { + return Promise.resolve({ + file_1234: "some_token_abcd", + file_2345: "some_token_bcde", + }); }; ``` @@ -257,67 +257,67 @@ preview.removeListener(EVENTNAME, listener); - `viewer` event will be triggered when we have the viewer instance first available. This will be the same object that is also a property included in the `load` event. Preview triggers this event before `load` so that clients can attach their listeners before the `load` event is triggered. - `load` event will be triggered on every preview load when `show()` is called or if inter-preview navigation occurs. The event data will contain: - ```js - error: 'message', // Error message if any error occurred while loading - viewer: {...}, // Instance of the current viewer object if no error occurred - metrics: {...}, // Performance metrics - file: {...} // Box file object with properties defined in file.js - ``` + ```js + error: 'message', // Error message if any error occurred while loading + viewer: {...}, // Instance of the current viewer object if no error occurred + metrics: {...}, // Performance metrics + file: {...} // Box file object with properties defined in file.js + ``` - `navigate` event will be triggered when navigation happens. The event includes the file ID of the file being navigated to, and this event will trigger before `load`. - `notification` event will be triggered when either the preview wrapper or one of the viewers wants to notify something like a warning or non-fatal error. The event data will contain: - ```js - message: 'message', // Message to show - type: 'warning' // 'warning', 'notice', or 'error' - ``` + ```js + message: 'message', // Message to show + type: 'warning' // 'warning', 'notice', or 'error' + ``` - `viewerevent` Each viewer will trigger its own sets of events. For example, the Image viewer will trigger `rotate` or `resize`, etc. while other viewers may trigger another set of events. The preview wrapper will also re-emit events at the preview level, with event data containing: - ```js - event: EVENTNAME, // Event name - data: DATA, // Event data object - viewerName: VIEWERNAME, // Name of the viewer. See VIEWERNAME above - fileId: fileId // The file ID - ``` + ```js + event: EVENTNAME, // Event name + data: DATA, // Event data object + viewerName: VIEWERNAME, // Name of the viewer. See VIEWERNAME above + fileId: fileId // The file ID + ``` ### Example event usage ```js var preview = new Box.Preview(); -preview.addListener("viewer", viewer => { - viewer.addListener("rotate", () => { - // Do something when a viewer rotates a preview - }); +preview.addListener("viewer", (viewer) => { + viewer.addListener("rotate", () => { + // Do something when a viewer rotates a preview + }); }); -preview.addListener("load", data => { - const viewer = data.viewer; - viewer.addListener("rotate", () => { - // Do something when a viewer rotates a preview - }); +preview.addListener("load", (data) => { + const viewer = data.viewer; + viewer.addListener("rotate", () => { + // Do something when a viewer rotates a preview + }); }); -preview.addListener("viewerevent", data => { - if (data.viewerName === "Image") { - if (data.event === "rotate") { - // Do something when an image preview is rotated - } - } else if (data.viewerName === "Image360") { - if (data.event === "rotate") { - // Do something different when a 360-degree image is rotated - } - } else { +preview.addListener("viewerevent", (data) => { + if (data.viewerName === "Image") { + if (data.event === "rotate") { + // Do something when an image preview is rotated } + } else if (data.viewerName === "Image360") { + if (data.event === "rotate") { + // Do something different when a 360-degree image is rotated + } + } else { + } }); -preview.addListener("rotate", data => { - if (data.viewerName === "Image") { - // Do something when an image preview is rotated - } else if (data.viewerName === "Image360") { - // Do something different when a 360-degree image is rotated - } else { - } +preview.addListener("rotate", (data) => { + if (data.viewerName === "Image") { + // Do something when an image preview is rotated + } else if (data.viewerName === "Image360") { + // Do something different when a 360-degree image is rotated + } else { + } }); ``` @@ -330,61 +330,61 @@ To add V4 annotations to preview: 1. Run `npm i box-annotations@latest`to install [box annotations][annotations]. - - Box annotations version should be at least major version 4 and up. - + +Box annotations version should be at least major version 4 and up. + 2. Run `npm i box-ui-elements@16.0.0` to install [BUIE][buie] version with annotation related change. - - Box UI elements should be the lowest working version that contains - fully working V4 annotations. - + +Box UI elements should be the lowest working version that contains +fully working V4 annotations. + 3. Import content preview and box annotations into your application: - ```js - import boxAnnotations from 'https://cdn.skypack.dev/box-annotations@latest'; - - var file_id = 'YOUR FILE ID'; - var accessToken = 'YOUR ACCESS TOKEN'; - - /* Enable annotations in sidebar */ - var contentSidebarProps = { - hasActivityFeed: true, - features: { - activityFeed: { - annotations: { - enabled: true - } - } - }, - } - - var options = { - container: '.previewer', - contentSidebarProps: contentSidebarProps, - - /* Enable annotations in preview */ - enableAnnotationsDiscoverability: true, - enableAnnotationsImageDiscoverability: true, - showAnnotations: true, - showAnnotationsControls: true, - showAnnotationsDrawingCreate: true, - }; - - /* BoxAnnotations */ - var annotations = new BoxAnnotations(); - - /* Box Preview */ - var contentPreviewer = new Box.ContentPreview(); - - /* Set annotation into previewer */ - options['boxAnnotations'] = annotations; - - /* Show previewer */ - contentPreviewer.show(file_id, accessToken, options); - ``` + ```js + import boxAnnotations from "https://cdn.skypack.dev/box-annotations@latest"; + + var file_id = "YOUR FILE ID"; + var accessToken = "YOUR ACCESS TOKEN"; + + /* Enable annotations in sidebar */ + var contentSidebarProps = { + hasActivityFeed: true, + features: { + activityFeed: { + annotations: { + enabled: true, + }, + }, + }, + }; + + var options = { + container: ".previewer", + contentSidebarProps: contentSidebarProps, + + /* Enable annotations in preview */ + enableAnnotationsDiscoverability: true, + enableAnnotationsImageDiscoverability: true, + showAnnotations: true, + showAnnotationsControls: true, + showAnnotationsDrawingCreate: true, + }; + + /* BoxAnnotations */ + var annotations = new BoxAnnotations(); + + /* Box Preview */ + var contentPreviewer = new Box.ContentPreview(); + + /* Set annotation into previewer */ + options["boxAnnotations"] = annotations; + + /* Show previewer */ + contentPreviewer.show(file_id, accessToken, options); + ``` The property `features: { activityFeed: { annotations: { enabled: true } } } } @@ -416,57 +416,130 @@ Box AI for UI Elements is a beta feature and it is available to **Enterprise Plus** customers. -The AI UI Element enhances the Content Preview UI Element -with the Box AI Q&A functionality. This allows the developers -to add the AI features to their custom app. -Adding the element facilitates answering questions and -taking actions like summarizing a document. +Box AI for UI Elements enhances the Content Preview UI Element +with additional features, allowing the developers +to add the Box Q&A AI functionality to their custom app. +Enriched with Box AI features, the Preview UI element brings the following functionality: + +- Q&A and document summaries. +- A **clear conversation** button that resets the conversation with Box AI. +- Citations that appear below the answer if included in the answer. +- Formatting support that allows requesting Markdown-formatted response, including bullet points or tables. +- Question history that allows referencing previous context to achieve the best response possible. The question history is kept only during the current session. +- Suggested questions that appear at the top of the chat by default to assist with the conversation. -To enable Box AI modal in content preview header, follow these steps: +![Box UI Element with Box AI options enabled](./images/box-ai-ui-element.jpg) + +### Enable Box AI for UI Elements + +To enable the Box AI modal in content preview header, follow these steps: 1. Make sure your Node and React versions are `18.x` or higher. -2. Download the [package that contains Box AI for UI Elements][aipackage]. -3. Pass the `contentAnswersProps` prop in Preview element. - - ```js - var preview = new Box.Preview(); - - preview.show(, , { - container: '.preview-container', - contentAnswersProps: { - show: true, - }, - hasHeader: true, - }); - ``` - - -Box AI for UI Elements is currently available only by -installing the `npm` package. -The CDN version is not yet supported. - +2. Download the [npm package that contains Box AI for UI Elements][aipackage] or directly from [Box CDN][installation]. +3. Install the peer dependencies: + + - [`box-ai-content-answers`][box-ai-content-answers] + - [`blueprint-web`][blueprint-web] + - [`blueprint-web-assets`][blueprint-web-assets] + + To do so, run the following command: + + ```sh + npx install-peerdeps box-ui-elements@^22.0.0 + ``` + +### Using JavaScript + +To enable Box AI features, pass the following: + +- `hasHeader` prop set to `true`, +- `contentAnswersProps` prop. The fields `show`, `isCitationsEnabled`, `isMarkdownEnabled`, `isResetChatEnabled` and `suggestedQuestions` are included by default. + +```js +const preview = new Box.Preview(); +const suggestedQuestions = [ + { + label: 'What are the key takeaways?', + prompt: 'What are the key takeaways?', + id: '1234', + }, + { + label: 'Summarize this document', + prompt: 'Summarize this document', + id: '5678', + }, +]; + +preview.show(, , { + container: '.preview-container', + contentAnswersProps={ + show: true, + isCitationsEnabled: true, + isMarkdownEnabled: true, + isResetChatEnabled: true, + suggestedQuestions + } + hasHeader: true, +}); +``` ### Using React component You can also add Box AI element to a header in a React component. -To do so, add `contentAnswersProps` with the field `show` set to `true`: +To do so, add: -```js -var ContentPreview = require('./ContentPreview').default; +- `hasHeader` prop set to `true`, +- `contentAnswersProps` prop. The fields `show`, `isCitationsEnabled`, `isMarkdownEnabled`, `isResetChatEnabled` and `suggestedQuestions` are included by default. - - - + + +To localize the `suggestedQuestions` properly, make sure that the prompts are translated. The optional `label` property is for screen readers, while the `prompt` property is the text displayed to the user in the AI modal. + + + +```js +import ContentPreview from 'box-ui-elements/es/elements/content-preview'; +import { IntlProvider } from "react-intl"; + +const suggestedQuestions = [ + { + label: 'Key takeaways', + prompt: 'What are the key takeaways from this document?', + id: '1234', + }, + { + label: 'Summarize', + prompt: 'Summarize this document', + id: '5678', + }, +]; + +export default () => { + // Storing variables in the front end is not secure. + // You will want to grab this value from a database for production + const TOKEN = process.env.REACT_APP_BOX_DEVELOPER_TOKEN + const FILE_ID = process.env.REACT_APP_BOX_PREVIEW_FILE_ID + return ( + + + + ); +}; ``` +You can further customize your apps using the following event listeners for Content Preview available with this release: `onAsk`, `onClearConversations`, and `onRequestClose`. + ## Scopes If your application requires the end user to only be able to access a subset of @@ -488,12 +561,12 @@ more, see [Dedicated Scopes for Box UI Elements][scopes]. ### Feature Scopes -| Scope Name | Permissions granted | -| ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `item_download` | Allows downloading/printing the content from the generated preview | +| Scope Name | Permissions granted | +| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `item_download` | Allows downloading/printing the content from the generated preview | | `annotation_edit` | Allows users to edit annotations (delete). Note: For highlight annotations to work, the text layer on the document needs to be enabled for the user. Text layer is disabled for all users that don't have download permissions on the file. To enable highlight annotations for a user, please ensure they have download permissions on the file. | -| `annotation_view_all` | Allows users to view all users' annotations. | -| `annotation_view_self` | Allows users to view their own annotations only. | +| `annotation_view_all` | Allows users to view all users' annotations. | +| `annotation_view_self` | Allows users to view their own annotations only. | # Enable highlight annotations with scopes The highlight scope is not included @@ -503,7 +576,7 @@ more, see [Dedicated Scopes for Box UI Elements][scopes]. ### Sample Scenarios -| Scenario | Scopes | +| Scenario | Scopes | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------- | | User should only be able to preview (not download/print, annotate) | `base_preview` | | User should be able to preview, download and print | `base_preview` + `item_download` | @@ -513,8 +586,11 @@ more, see [Dedicated Scopes for Box UI Elements][scopes]. | User should be able to preview and only view their own annotations but not add/delete (ex: after review period has expired, all documents need to be stored in read only mode) | `base_preview` + `annotation_view_self` | + [filetypes]: https://support.box.com/hc/en-us/articles/360043695794-Viewing-Different-File-Types-Supported-in-Box-Content-Preview + + [downscope]: guide://authentication/tokens/downscope [scopes]: g://api-calls/permissions-and-errors/scopes [annotations]: https://github.com/box/box-annotations @@ -525,3 +601,7 @@ more, see [Dedicated Scopes for Box UI Elements][scopes]. [expiredembed]: r://file--full/#param-expiring_embed_link [token]: g://authentication/tokens/developer-tokens [aipackage]: https://github.com/box/box-ui-elements/releases/tag/v20.0.0-beta.17 +[installation]: g://embed/ui-elements/installation +[blueprint-web]: https://www.npmjs.com/package/@box/blueprint-web +[box-ai-content-answers]: https://www.npmjs.com/package/@box/box-ai-content-answers +[blueprint-web-assets]: https://www.npmjs.com/package/@box/blueprint-web-assets diff --git a/package.json b/package.json index 186a368dc..8e330e3dd 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "lint:ci": "concurrently 'yarn lint:links' 'yarn lint:markdown' 'yarn lint:spelling' 'yarn lint:alex'", "lint:markdown": "markdownlint -c markdownlintrc.json ./content ./templates", "lint:spelling": "yarn lint:spelling:interactive -r", - "lint:spelling:interactive": "mdspell 'content/**/*.md' README.md CONTRIBUTING.md -a -n --en-us -d content/dictionaries/en_US", + "lint:spelling:interactive": "mdspell 'content/**/*.md' '!content/guides/box-ai/ai-agents/*.md' README.md CONTRIBUTING.md -a -n --en-us -d content/dictionaries/en_US", "lint:alex": "alex content/ -q", "lint:yaml": "yamllint ./content", "lint:links": "jest ./src/markdown/tests/* --silent", From 770a5b2f2a8d7b316029cd8d20a13679f9b49e50 Mon Sep 17 00:00:00 2001 From: Olga Stefaniuk Date: Thu, 24 Oct 2024 10:22:40 +0200 Subject: [PATCH 10/13] Remove beta pill from AI Dev Zone (#614) * DEVREL-427: remove beta pill from the AI Dev Zone * Remove beta info from summary demo * Improve legal note * Update copy for metadata demo * Add pricing info to demo summary * Update legal info alignment * Remove pricing info --- content/microcopy/ai_dev_zone.yml | 8 +++++--- content/pages/ai-dev-zone/index.md | 6 +++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/content/microcopy/ai_dev_zone.yml b/content/microcopy/ai_dev_zone.yml index 1f60395e4..0ad5e364a 100644 --- a/content/microcopy/ai_dev_zone.yml +++ b/content/microcopy/ai_dev_zone.yml @@ -49,7 +49,7 @@ sample_code: headline: Box AI API paragraph: Use this endpoint to integrate the document summary into your application. - pricing: Box AI API is available in public beta to all + pricing: This endpoint is available to all Enterprise Plus customers. metadata: headline: Box AI API - extract structured @@ -57,13 +57,15 @@ sample_code: document structured metadata extraction to your applications. Pass a Box metadata template ID or your own metadata structure as a parameter. - pricing: Pricing and packaging to be announced. + pricing: This endpoint is + available in public beta to all Enterprise Plus customers. metadata-unstructured: headline: Box AI API - extract paragraph: Use this endpoint to add document freeform metadata extraction to your applications. The endpoint allows various prompt formats. - pricing: Pricing and packaging to be announced. + pricing: This endpoint is + available in public beta to all Enterprise Plus customers. developer_console: headline: Box Developer Console cta: Get started diff --git a/content/pages/ai-dev-zone/index.md b/content/pages/ai-dev-zone/index.md index 39a3371e6..ca8d90dc4 100644 --- a/content/pages/ai-dev-zone/index.md +++ b/content/pages/ai-dev-zone/index.md @@ -23,13 +23,13 @@ view sample code, explore Box AI use cases, and more!
Try out interactive demos
-Box AI API is currently a beta feature offered subject to Box’s Main Beta Agreement, and the available capabilities may change. Box AI API is available to all Enterprise Plus customers. - + Box AI API is available to all Enterprise Plus customers. Endpoints related to metadata extraction are currently a beta feature offered subject to Box’s Main Beta Agreement, and the available capabilities may change. + Summarize a document in a selected tone of voice. - Public beta + New From 38b2d894fb265c5ca32cdf793142d7e721803bad Mon Sep 17 00:00:00 2001 From: Olga Stefaniuk Date: Thu, 24 Oct 2024 12:53:00 +0200 Subject: [PATCH 11/13] Pinecone (#623) * Resolve conflicts * Resolve conflicts * Adjust copy * Improve copy --- content/pages/ai-dev-zone/index.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/content/pages/ai-dev-zone/index.md b/content/pages/ai-dev-zone/index.md index ca8d90dc4..791115a19 100644 --- a/content/pages/ai-dev-zone/index.md +++ b/content/pages/ai-dev-zone/index.md @@ -100,6 +100,12 @@ view sample code, explore Box AI use cases, and more! href="https://python.langchain.com/v0.2/docs/integrations/providers/box/"> Include Box content in your LLM workflows with Box loader for LangChain. + New + + + Connect Box and Pinecone to customize vector embeddings and get more relevant answers from LLM. + New @@ -147,4 +153,4 @@ view sample code, explore Box AI use cases, and more! View all videos - + \ No newline at end of file From 38faad88f4b940b02e934df250a76fcb2ec69813 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Barbara=20Czy=C5=BC?= Date: Thu, 24 Oct 2024 17:27:15 +0200 Subject: [PATCH 12/13] DDOC-1184 add AWS models (#620) * Add AWS to model list * preview update * Fix linter issues * Add note about preview * fix lint --- .../guides/box-ai/ai-agents/overrides-tutorial.md | 7 ++++--- content/guides/box-ai/supported-models.md | 12 +++++++----- content/guides/embed/ui-elements/preview.md | 3 +-- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/content/guides/box-ai/ai-agents/overrides-tutorial.md b/content/guides/box-ai/ai-agents/overrides-tutorial.md index ec6319b93..b210ac554 100644 --- a/content/guides/box-ai/ai-agents/overrides-tutorial.md +++ b/content/guides/box-ai/ai-agents/overrides-tutorial.md @@ -126,11 +126,11 @@ The set of parameters available for `ask`, `text_gen`, `extract`, `extract_struc ### LLM endpoint params -The `llm_endpoint_params` configuration options differ depending on the overall AI model being [Google][google-params] or [OpenAI][openai-params] based. +The `llm_endpoint_params` configuration options differ depending on the overall AI model being [Google][google-params], [OpenAI][openai-params] or [AWS][aws-params] based. For example, both `llm_endpoint_params` objects accept a `temperature` parameter, but the outcome differs depending on the model. -For Google models, the [`temperature`][google-temp] is used for sampling during response generation, which occurs when `top-P` and `top-K` are applied. Temperature controls the degree of randomness in the token selection. +For Google and AWS models, the [`temperature`][google-temp] is used for sampling during response generation, which occurs when `top-P` and `top-K` are applied. Temperature controls the degree of randomness in the token selection. For OpenAI models, [`temperature`][openai-temp] is the sampling temperature with values between 0 and 2. Higher values like 0.8 make the output more random, while lower values like 0.2 make it more focused and deterministic. When introducing your own configuration, use `temperature` or or `top_p` but not both. @@ -353,4 +353,5 @@ Using this model results in a response listing more metadata entries: [openai-tokens]: https://help.openai.com/en/articles/4936856-what-are-tokens-and-how-to-count-them [agent]: e://get_ai_agent_default [google-temp]: https://ai.google.dev/gemini-api/docs/models/generative-models#model-parameters -[openai-temp]: https://community.openai.com/t/temperature-top-p-and-top-k-for-chatbot-responses/295542 \ No newline at end of file +[openai-temp]: https://community.openai.com/t/temperature-top-p-and-top-k-for-chatbot-responses/295542 +[aws-params]: r://ai-llm-endpoint-params-aws \ No newline at end of file diff --git a/content/guides/box-ai/supported-models.md b/content/guides/box-ai/supported-models.md index 368028a3c..800fe79d6 100644 --- a/content/guides/box-ai/supported-models.md +++ b/content/guides/box-ai/supported-models.md @@ -19,13 +19,11 @@ Make sure you use **two underscores** after the provider name. The list may change depending on the model availability. -**Preview** means you can use the model, but the access to all its features -may be limited. +Models offered in **Preview** mode have not been fully performance-tested at scale and are made available on an as-is basis. You may experience variability in model/output quality, availability, and accuracy | Provider | Family |Availability| API Name | External documentation | Capability | | --------------- | ------ |-----| --------------------------------------- | ----------------------------------------------------------------------- | ---------- | -| Microsoft Azure | GPT |available| `azure__openai__gpt_3_5_turbo_16k` | [Azure OpenAI GPT-3.5 model documentation][azure-ai-model-gpt35] | Chat | | Microsoft Azure | GPT |available| `azure__openai__gpt_4o_mini` | [Azure OpenAI GPT-4o-mini model documentation][azure-ai-model-gpt40] | Chat | | Microsoft Azure | GPT |available| `azure__openai__text_embedding_ada_002` | [Azure OpenAI embeddings models documentation][azure-ai-embeddings] | Embeddings | | GCP Vertex | Gecko | available |`google__textembedding_gecko` | [Google Vertex AI embeddings models documentation][vertex-ai-model] | Embeddings | @@ -36,12 +34,14 @@ may be limited. | GCP Vertex | PaLM | available |`google__text_unicorn` | [Google PaLM 2 for Text model documentation][vertex-text-models] | Chat | | GCP Vertex | PaLM | available |`google__text_bison` | [Google PaLM 2 for Text model documentation][vertex-text-models] | Chat | | GCP Vertex | PaLM |available| `google__text_bison_32k` | [Google PaLM 2 for Text model documentation][vertex-text-models] | Chat | +| AWS | Claude |preview | `aws__claude_3_haiku` | [Amazon Claude model documentation][aws-claude] | Chat | +| AWS | Claude |preview | `aws__claude_3_sonnet` | [Amazon Claude model documentation][aws-claude] | Chat | +| AWS | Claude |preview | `aws__claude_3_5_sonnet` | [Amazon Claude model documentation][aws-claude] | Chat | +| AWS | Titan |preview | `aws__titan_text_lite` | [Amazon Titan model documentation][aws-titan] | Chat | [ask]: e://post_ai_ask [text-gen]: e://post_ai_text_gen [agent]: e://get_ai_agent_default -[openai-gpt-3-5-model]: https://platform.openai.com/docs/models/gpt-3-5-turbo -[azure-ai-model-gpt35]: https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models#gpt-35 [azure-ai-model-gpt40]: https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models#gpt-4o-and-gpt-4-turbo [vertex-ai-model]: https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#models [vertex-ai-gemini-models]: https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#gemini-models @@ -50,3 +50,5 @@ may be limited. [azure-ai-embeddings]: https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models#embeddings [openai-embeddings]: https://platform.openai.com/docs/models/embeddings [ai-model]: e://get-ai-agent-default#param-model +[aws-claude]: https://aws.amazon.com/bedrock/claude/ +[aws-titan]: https://aws.amazon.com/bedrock/titan/ diff --git a/content/guides/embed/ui-elements/preview.md b/content/guides/embed/ui-elements/preview.md index 5965ad886..036b5277b 100644 --- a/content/guides/embed/ui-elements/preview.md +++ b/content/guides/embed/ui-elements/preview.md @@ -597,10 +597,9 @@ more, see [Dedicated Scopes for Box UI Elements][scopes]. [buie]: https://github.com/box/box-ui-elements/releases/tag/v16.0.0 [annotationsguide]: g://embed/ui-elements/annotations.md [previewlib]: https://github.com/box/box-content-preview -[ainpm]: https://www.npmjs.com/package/box-ui-elements/v/19.0.0-beta.34 [expiredembed]: r://file--full/#param-expiring_embed_link [token]: g://authentication/tokens/developer-tokens -[aipackage]: https://github.com/box/box-ui-elements/releases/tag/v20.0.0-beta.17 +[aipackage]: https://www.npmjs.com/package/box-ui-elements/v/22.0.0 [installation]: g://embed/ui-elements/installation [blueprint-web]: https://www.npmjs.com/package/@box/blueprint-web [box-ai-content-answers]: https://www.npmjs.com/package/@box/box-ai-content-answers From 862d79109658bec580998b442cb261e839f67562 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Barbara=20Czy=C5=BC?= Date: Fri, 25 Oct 2024 09:13:38 +0200 Subject: [PATCH 13/13] DDOC-1163: Add hubs to embed docs (#621) * DDOC-1163: Add hubs to embed docs * improvements to structure * updates --- content/guides/embed/box-embed.md | 69 ++++++++++++++++++------------- 1 file changed, 40 insertions(+), 29 deletions(-) diff --git a/content/guides/embed/box-embed.md b/content/guides/embed/box-embed.md index 08726ad74..0b9bc4826 100644 --- a/content/guides/embed/box-embed.md +++ b/content/guides/embed/box-embed.md @@ -10,43 +10,52 @@ alias_paths: # Box Embed -Box Embed is a HTML-based framework that makes it possible to embed the entire -Box Web App experience anywhere people work. Box Embed provides the ability to -upload, search, comment, share, tag, and edit files using Box Edit. +Box Embed is a HTML-based framework that allows embedding the entire +Box Web App experience in a custom-made application. Box Embed provides the ability to upload, search, comment, share, tag, and edit files using Box Edit. -## Configure +## Before you start -To create the widget, you need to set the folder for sharing and you -need to have at least **Viewer** [permissions][5]. +To create a widget, you need to: -### From the web +* Set an embeddable element, such as a **folder**, **file**, or **Hub** for sharing. +* Have at least **Viewer** [permissions][5]. -To grab your Box Embed code from the Box web app: +## Using web app -- navigate to the folder of choice, -- click on the ellipsis beside the folder, -- go to **More Actions**, -- click **Embed Widget**. +To fetch the Box Embed widget code from the Box web app, perform the following steps. + +### Files and folders + +1. Navigate to the chosen file or folder. +2. Click on the ellipsis next to the folder. +3. Go to **More Actions** > **Embed Widget**. + +### Hubs + +1. Navigate to the chosen Hub. +2. Click on the ellipsis menu in the top right corner. +3. Click **Embed Widget**. ![Box Embed](./box-embed-new.png) -The next screen allows you to configure the size, sorting, and view of -the widget. You can also choose to hide the folder path, and to expand -the navigation & sidebar by default. +In the next step, configure the parameters of an embeddable element. + +| Files | Folders | Hubs | +|----------|----------|------------------------| +|Size of the widget.| Size of the widget, sorting of the files in a folder, hiding the navigation path and sidebar | Size of the widget, hiding the parent navigation path and sidebar. | ![Box Embed Configuration](./embed-configuration.png) -Once you are done customizing the embed widget, you need to copy +When you are done customizing the embed widget, copy and paste the embed code into your site or web application. ## Programmatically -If you want to add more customization to Box Embed, you have the ability to -build it programmatically. The format for an embed snippet is as follows. +If you want to customize Box Embed even further, you can do it programmatically. The format for an embed snippet is as follows: ```html