{"id":28416,"date":"2025-02-10T12:42:02","date_gmt":"2025-02-10T04:42:02","guid":{"rendered":"https:\/\/www.1ai.net\/?p=28416"},"modified":"2025-02-10T12:42:14","modified_gmt":"2025-02-10T04:42:14","slug":"deepseek-r1%e8%81%8a%e5%a4%a9%e6%9c%ba%e5%99%a8%e4%ba%ba%e5%bc%80%e5%8f%91%e6%95%99%e7%a8%8b%ef%bc%8c%e6%88%91%e4%bb%ac%e7%94%a8-python-%e6%9e%84%e5%bb%ba%e4%b8%80%e4%b8%aa-deepseek-r1%e8%81%8a","status":"publish","type":"post","link":"https:\/\/www.1ai.net\/en\/28416.html","title":{"rendered":"DeepSeek-R1 chatbot development tutorial, we build a DeepSeek-R1 chatbot in Python!"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-28417\" title=\"c2670d04j00srga2u00i7d000m800bkp\" src=\"https:\/\/www.1ai.net\/wp-content\/uploads\/2025\/02\/c2670d04j00srga2u00i7d000m800bkp.jpg\" alt=\"c2670d04j00srga2u00i7d000m800bkp\" width=\"800\" height=\"416\" \/><\/p>\n<p>The rate of progress in the field of AI is truly moving at an unprecedented pace. In just over a week, the<a href=\"https:\/\/www.1ai.net\/en\/tag\/deepseek\" title=\"[View articles tagged with [DeepSeek]]\" target=\"_blank\" >DeepSeek<\/a>-R1 LLM models have rocked the AI world with the release of their impressive accuracy, which is comparable to existing models but created at a fraction of the typical cost.<\/p>\n<p>The DeepSeek team succeeded in distilling the reasoning of its large 671B parameter model into six small models based on Qwen (DeepSeek-R1-Distilla-Qwen-1.5B, 7B, 14B and 32B) and Llama (DeepSeek-R1-Distilla-Llama-8B and 70B). This actually means you can use your own model copy -- customize it, change it, run it locally or host it on a cloud platform\u3002<\/p>\n<p>In this paper, we use <a href=\"https:\/\/www.1ai.net\/en\/tag\/python\" title=\"_Other Organiser\" target=\"_blank\" >Python<\/a> Building a DeepSeek-R1 <a href=\"https:\/\/www.1ai.net\/en\/tag\/%e8%81%8a%e5%a4%a9%e6%9c%ba%e5%99%a8%e4%ba%ba\" title=\"[View articles tagged with [chatbot]]\" target=\"_blank\" >Chatbots<\/a>In short, Streamlit is used on the front end. In short, Streamlit is used on the front-end, while on the back-end, API calls to the DeepSeek-R1 model hosted in Snowflake enable the implementation of LLM models that provide support for application responses.<\/p>\n<p>Click<a href=\"https:\/\/github.com\/Snowflake-Labs\/snowflake-demo-streamlit\/tree\/main\/DeepSeek-R1%20chatbot\">here are<\/a>Check out the GitHub repository for this tutorial.<\/p>\n<p><strong>1\u3001What is DeepSeek-R1?<\/strong><\/p>\n<p>In short, DeepSeek-R1 is an inference model that uses reinforcement learning to teach the basic language model DeepSeek-V3 to reason without human supervision.<\/p>\n<p>Here are the 5 main features of DeepSeek-R1:<\/p>\n<ul>\n<li>State-of-the-art reasoning: DeepSeek-R1 can achieve an accuracy of 97.3% on advanced math tasks, outperforming earlier benchmarks. Similarly, its score of 79.8% on AIME 2024 and 49.2% on SWE-bench Verified outperforms other models.<\/li>\n<li>Cost efficiency: DeepSeek models are significantly cheaper to train than industry standards<\/li>\n<li>Wide range of applications: excels in creative writing, long contextual comprehension and factual quizzes.<\/li>\n<li>Scalability: The model is available in several compact versions (1.5B to 70B parameters), which optimizes the balance between capacity and resource use.<\/li>\n<li>Accessibility: Open source availability allows developers and researchers to try out the model to apply advanced AI tools to real projects.<\/li>\n<\/ul>\n<p>Despite its excellent performance, there may still be concerns about the security aspects of its use. With this in mind, since the model is open source, the underlying code can be inspected and the model itself can be self-deployed on the user's own computing resources.<\/p>\n<p>In this tutorial, we'll use a tutorial hosted on the\u00a0<a href=\"https:\/\/www.snowflake.com\/en\/blog\/deepseek-preview-snowflake-cortex-ai\/\">DeepSeek-R1 model in the Snowflake platform<\/a>.<\/p>\n<p><strong>2. Overview of the application<\/strong><\/p>\n<p>Here is a high-level overview of the DeepSeek-R1 chatbot app:<\/p>\n<ul>\n<li>The user provides prompted input (i.e., asks questions).<\/li>\n<li>An LLM call is made using SNOWFLAKE.CORTEX.COMPLETE(), which submits the prompted input and gets the LLM-generated response and displays it in the application.<\/li>\n<\/ul>\n<p><strong>3. Operation of chatbots<\/strong><\/p>\n<p>Let's see the chatbot in action by launching the chatbot and typing a question into the chat input:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-28418\" title=\"96c0bcebj00srga0l005bd000ks00bqm\" src=\"https:\/\/www.1ai.net\/wp-content\/uploads\/2025\/02\/96c0bcebj00srga0l005bd000ks00bqm.jpg\" alt=\"96c0bcebj00srga0l005bd000ks00bqm\" width=\"748\" height=\"422\" \/><\/p>\n<p>As a reasoning model, LLM first enters the thinking phase:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-28419\" title=\"b0562687j00srga0m00bed000n000iem\" src=\"https:\/\/www.1ai.net\/wp-content\/uploads\/2025\/02\/b0562687j00srga0m00bed000n000iem.jpg\" alt=\"b0562687j00srga0m00bed000n000iem\" width=\"828\" height=\"662\" \/><\/p>\n<p>Once the thought process is complete, the final answer will be shown below:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-28420\" title=\"bae88e22j00srga0m00a0d000n000iem\" src=\"https:\/\/www.1ai.net\/wp-content\/uploads\/2025\/02\/bae88e22j00srga0m00a0d000n000iem.jpg\" alt=\"bae88e22j00srga0m00a0d000n000iem\" width=\"828\" height=\"662\" \/><\/p>\n<p>It should be noted that the depth of thinking and answers is directly affected by the maximum token parameter. Here, we have limited the maximum tokens to 800 for testing purposes, but you can increase this to 20,480.<\/p>\n<p><strong>4. Building the DeepSeek-R1 chatbot<\/strong><\/p>\n<p>Now let's move on to building the DeepSeek-R1 chatbot on the Snowflake platform.<\/p>\n<p>4.1 Setting up the development environment<\/p>\n<p>To access the necessary tools, make sure you have access to a Snowflake account.<\/p>\n<p>Next, navigate to Streamlit in Snowflake, go to Project \u2192 Streamlit, and click + Streamlit App to create the app (you will then specify the app location and repository):<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-28421\" title=\"6c2147c1j00srga0l0064d000n0009hm\" src=\"https:\/\/www.1ai.net\/wp-content\/uploads\/2025\/02\/6c2147c1j00srga0l0064d000n0009hm.jpg\" alt=\"6c2147c1j00srga0l0064d000n0009hm\" width=\"828\" height=\"341\" \/><\/p>\n<p>Next, you'll see a sample starter app to help get started:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-28422\" title=\"ec30e203j00srga0m008rd000n000czm\" src=\"https:\/\/www.1ai.net\/wp-content\/uploads\/2025\/02\/ec30e203j00srga0m008rd000n000czm.jpg\" alt=\"ec30e203j00srga0m008rd000n000czm\" width=\"828\" height=\"467\" \/><\/p>\n<p>The Streamlit interface in Snowflake is similar to an online code editor, where you can edit code on the left and view the rendered application on the right.<\/p>\n<p>Go ahead and replace it with the application we're building today.<\/p>\n<p>4.2 Retrieving codes<\/p>\n<p>The DeepSeek-R1 chatbot application we're building today consists of the following components:<\/p>\n<ul>\n<li>environment.yml - environment dependencies for the application<\/li>\n<li>streamlit_app.py - Streamlit application file<\/li>\n<\/ul>\n<p>First, the contents of the environment.yml file are shown below:<\/p>\n<pre><code>name: app_environment\r\nchannels: snowflake\r\n  - snowflake\r\ndependencies: python=3.11.*\r\n  - snowflake-ml-python\r\n  - snowflake-ml-python\r\n  - snowflake-snowpark-python\r\n  - streamlit<\/code><\/pre>\n<p>Next, the contents of the sis_app.py file are shown below:<\/p>\n<pre><code>import streamlit as st\r\nfrom snowflake.snowpark.context import get_active_session\r\nimport pandas as pd\r\nimport json\r\nimport re\r\n\r\n# App configuration\r\nst.set_page_config(page_title=\"\ud83d\udc33\ud83d\udcac DeepSeek R1 Chatbot\", initial_sidebar_state=\"expanded\")\r\nsession = get_active_session()\r\n\r\n# Helper functions\r\ndef clear_chat_history(): st.session_state.\r\n    st.session_state.messages = [{\"role\": \"assistant\", \"content\": \"How may I assist you today?\"}]\r\n\r\ndef escape_sql_string(s):: return s.replace(\"'\").\r\n    return s.replace(\"'\", \"''\")\r\n\r\ndef extract_think_content(response).\r\n    think_pattern = r'(. *?) '\r\n    think_match = re.search(think_pattern, response, re.DOTALL)\r\n\r\n    if think_match.\r\n        think_content = think_match.group(1).strip()\r\n        main_response = re.sub(think_pattern, '', response, flags=re.DOTALL).strip()\r\n        return think_content, main_response\r\n    return None, response\r\n\r\ndef generate_deepseek_response(prompt, **params):\r\n    string_dialogue = \"\".join(\r\n        f\"{msg['content']}\\n\\n\"\r\n        for msg in st.session_state.messages\r\n    )\r\n\r\n    cortex_prompt = f\"'[INST] {string_dialogue}{prompt} [\/INST]'\"\r\n    prompt_data = [{'role': 'user', 'content': cortex_prompt}], params\r\n    prompt_json = escape_sql_string(json.dumps(prompt_data))\r\n    response = session.sql(\r\n        \"select snowflake.cortex.complete(? , ?)\" ,\r\n        params=['deepseek-r1', prompt_json]\r\n    ).collect()[0][0]\r\n\r\n    return response\r\n\r\n# Model parameters configuration\r\nMODEL_PARAMS = {\r\n    \r\n    'top_p': {'min': 0.01, 'max': 1.0, 'default': 1.0, 'step': 0.01},\r\n    \r\n    'presence_penalty': {'min': -1.0, 'max': 1.0, 'default': 0.0, 'step': 0.1},\r\n    'frequency_penalty': {'min': -1.0, 'max': 1.0, 'default': 0.0, 'step': 0.1}\r\n}\r\n\r\n# Sidebar UI\r\nwith st.sidebar.\r\n    st.title('\ud83d\udc33\ud83d\udcac DeepSeek R1 Chatbot')\r\n    st.write('This chatbot is created using the DeepSeek R1 LLM model via Snowflake Cortex.')\r\n\r\n    st.subheader('\u2699\ufe0f Model parameters')\r\n    params = {\r\n        param: st.sidebar.slider(\r\n            param.replace('_', ' ').title(),\r\n            min_value=settings['min'],\r\n            max_value=settings['max'],\r\n            value=settings['default'],\r\n            step=settings['step']\r\n        )\r\n        for param, settings in MODEL_PARAMS.items()\r\n    }\r\n\r\n    st.button('Clear Chat History', on_click=clear_chat_history)\r\n\r\n# Initialize chat history\r\nif \"messages\" not in st.session_state: st.session_state.\r\n    st.session_state.messages = [{\"role\": \"assistant\", \"content\": \"How may I assist you today?\"}]\r\n\r\n# Display chat messages\r\nfor message in st.session_state.messages: with st.chat_message.\r\n    with st.chat_message(message[\"role\"]):\r\n        st.write(message[\"content\"])\r\n\r\n# Handle user input\r\nif prompt := st.chat_input(): with st.chat_message(message[\"role\"]: st.write(message[\"content\"])\r\n    with st.chat_message(\"user\").\r\n        st.write(prompt)\r\n    st.session_state.messages.append({\"role\": \"user\", \"content\": prompt})\r\n\r\n    if st.session_state.messages[-1][\"role\"] ! = \"assistant\": if st.session_state.messages[-1][\"role\"] !\r\n        with st.chat_message(\"assistant\")::\r\n            status_container = st.status(\"Thinking ...\" , expanded=True)\r\n\r\n            with status_container: response = generate_deepseek\r\n                response = generate_deepseek_response(prompt, **params)\r\n                think_content, main_response = extract_think_content(response)\r\n                if think_content.\r\n                    st.write(think_content)\r\n\r\n            status_container.update(label=\"Thoughts\", state=\"complete\", expanded=False)\r\n            st.markdown(main_response)\r\n            st.session_state.messages.append({\"role\": \"assistant\", \"content\": main_response})<\/code><\/pre>\n<p>You can also get the DeepSeek-R1 chatbot from here. <a href=\"https:\/\/github.com\/Snowflake-Labs\/snowflake-demo-streamlit\/tree\/main\/DeepSeek-R1%20chatbot\">Github Repositories<\/a>Download the necessary application files.<\/p>\n<p>4.3 Running the application<\/p>\n<p>To run the application, copy and paste the above code and click the Run button.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-28423\" title=\"e056737dj00srga0m0097d000n000czm\" src=\"https:\/\/www.1ai.net\/wp-content\/uploads\/2025\/02\/e056737dj00srga0m0097d000n000czm.jpg\" alt=\"e056737dj00srga0m0097d000n000czm\" width=\"828\" height=\"467\" \/><\/p>\n<p>You can place the mouse cursor on the divider of the Code\/Application panel and move it to the left until the Code panel disappears (see below). This will expand the application panel to full screen.<\/p>\n<p>Continue and type in the prompt to start your chat session:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-28424\" title=\"3254b835j00srga0l0035d000n000czm\" src=\"https:\/\/www.1ai.net\/wp-content\/uploads\/2025\/02\/3254b835j00srga0l0035d000n000czm.jpg\" alt=\"3254b835j00srga0l0035d000n000czm\" width=\"828\" height=\"467\" \/><\/p>\n<p>Also, see the Chatbot Hands-On section above for the thought process and answers generated by LLM.<\/p>\n<p><strong>5. Code description<\/strong><\/p>\n<p>Let's explore what each code block is doing ......<\/p>\n<p>5.1 Importing libraries<\/p>\n<p>We'll start by importing the prerequisite library.<\/p>\n<pre><code>import streamlit as st\r\nfrom snowflake.snowpark.context import get_active_session\r\nimport pandas as pd\r\nimport json\r\nimport re<\/code><\/pre>\n<p>5.2 Application configuration<\/p>\n<p>next, we use st.set_page_config() to define the application page and set its initial page parameters, and we set the intial_sidebar_state = \u201cexpanded\u201d so that they fully follow that and expand the sidebar. here, we set the session variable, and we'll use it later\u3002<\/p>\n<pre><code># App configuration\r\nst.set_page_config(page_title=\"\ud83d\udc33\ud83d\udcac DeepSeek R1 Chatbot\", initial_sidebar_state=\"expanded\")\r\nsession = get_active_session()<\/code><\/pre>\n<p>5.3 Auxiliary Functions<\/p>\n<p>In this section, we define several helper functions that will be used in later parts of the application:<\/p>\n<ul>\n<li>clear_chat_history() - this allows us to clear the chat history to its initial state<\/li>\n<li>escape_sql_string() - replaces the SQL string when performing some text formatting<\/li>\n<li>extract_think_content() - parses and separates the content contained in the XML style \"think\" tags ( and ) and separates it from the final response.<\/li>\n<\/ul>\n<pre><code># Helper functions\r\ndef clear_chat_history(): st.session_state.messages = [{\"role\": \"assistant\"?\r\n    st.session_state.messages = [{\"role\": \"assistant\", \"content\": \"How may I assist you today?\"}]\r\n\r\ndef escape_sql_string(s):: return s.replace(\"'\").\r\n    return s.replace(\"'\", \"''\")\r\n\r\ndef extract_think_content(response).\r\n    think_pattern = r'(. *?) '\r\n    think_match = re.search(think_pattern, response, re.DOTALL)\r\n\r\n    if think_match.\r\n        think_content = think_match.group(1).strip()\r\n        main_response = re.sub(think_pattern, '', response, flags=re.DOTALL).strip()\r\n        return think_content, main_response\r\n    return None, response<\/code><\/pre>\n<p>For example, suppose we have the following generated response:<\/p>\n<pre><code>Let me analyze this problem step by step... &lt;\/Here&#039;s the solution you&#039;re looking for...\r\nHere&#039;s the solution you&#039;re looking for...<\/code><\/pre>\n<p>It will parse and separate as:<\/p>\n<ul>\n<li>think_content: \"Let me analyze this step by step ......\"<\/li>\n<li>main_response: \"This is the solution you are looking for ......\"<\/li>\n<\/ul>\n<p>Let's move on to the last helper function:<\/p>\n<ul>\n<li>generate_deepseek_response() - generates an LLM response using Snowflake's Cortex service and the DeepSeek R1 model<\/li>\n<\/ul>\n<pre><code>def generate_deepseek_response(prompt, **params):\r\n    string_dialogue = \"\".join(\r\n        f\"{msg['content']}\\n\\n\"\r\n        for msg in st.session_state.messages\r\n    )\r\n\r\n    cortex_prompt = f\"'[INST] {string_dialogue}{prompt} [\/INST]'\"\r\n    prompt_data = [{'role': 'user', 'content': cortex_prompt}], params\r\n    prompt_json = escape_sql_string(json.dumps(prompt_data))\r\n    response = session.sql(\r\n        \"select snowflake.cortex.complete(? , ?)\" ,\r\n        params=['deepseek-r1', prompt_json]\r\n    ).collect()[0][0]\r\n\r\n    return response<\/code><\/pre>\n<p>5.4 Sidebar UI<\/p>\n<p>We start by defining the variables in a dictionary format containing the model parameters and the associated minimum, maximum, default and step values.<\/p>\n<p>MODEL_PARAMS<\/p>\n<p>Next, we'll define the sidebar that starts with the application title and application description. Here we also include several slider widgets created by iterating through a for loop. Finally, we have a clear chat history button that calls the clear_chat_history callback function to reset the history to its initial state.<\/p>\n<pre><code># Model parameters configuration\r\nMODEL_PARAMS = {\r\n    'temperature': {'min': 0.01, 'max': 1.0, 'default': 0.7, 'step': 0.01}, 'top_p': {'min': 0.01, 'max': 1.0, 'default': 1.0, 'step': 1.0\r\n    'top_p': {'min': 0.01, 'max': 1.0, 'default': 1.0, 'step': 0.01},\r\n    \r\n    'presence_penalty': {'min': -1.0, 'max': 1.0, 'default': 0.0, 'step': 0.1},\r\n    'frequency_penalty': {'min': -1.0, 'max': 1.0, 'default': 0.0, 'step': 0.1}\r\n}\r\n\r\n# Sidebar UI\r\nwith st.sidebar.\r\n    st.title('\ud83d\udc33\ud83d\udcac DeepSeek R1 Chatbot')\r\n    st.write('This chatbot is created using the DeepSeek R1 LLM model via Snowflake Cortex.')\r\n\r\n    st.subheader('\u2699\ufe0f Model parameters')\r\n    params = {\r\n        param: st.sidebar.slider(\r\n            param.replace('_', ' ').title(),\r\n            min_value=settings['min'],\r\n            max_value=settings['max'],\r\n            value=settings['default'],\r\n            step=settings['step']\r\n        )\r\n        for param, settings in MODEL_PARAMS.items()\r\n    }\r\n\r\n    st.button('Clear Chat History', on_click=clear_chat_history)<\/code><\/pre>\n<p>5.5 Chat Elements<\/p>\n<p>In the final part of the application, we will initialize the session state variables of the chat history, iteratively display incoming chat messages, and finally define the conditional flow that handles the user\/application chat logic. The latter section utilizes previously defined helper functions to process LLM-generated responses.<\/p>\n<pre><code># Initialize chat history\r\nif \"messages\" not in st.session_state: [{\"role\": \"assistant\": \"content\": \"How may I assist you today?\r\n    st.session_state.messages = [{\"role\": \"assistant\", \"content\": \"How may I assist you today?\"}]\r\n\r\n# Display chat messages\r\nfor message in st.session_state.messages: with st.chat_message.\r\n    with st.chat_message(message[\"role\"]):\r\n        st.write(message[\"content\"])\r\n\r\n# Handle user input\r\nif prompt := st.chat_input(): with st.chat_message(message[\"role\"]: st.write(message[\"content\"])\r\n    with st.chat_message(\"user\").\r\n        st.write(prompt)\r\n    st.session_state.messages.append({\"role\": \"user\", \"content\": prompt})\r\n\r\n    if st.session_state.messages[-1][\"role\"] ! = \"assistant\": if st.session_state.messages[-1][\"role\"] !\r\n        with st.chat_message(\"assistant\")::\r\n            status_container = st.status(\"Thinking ...\" , expanded=True)\r\n\r\n            with status_container: response = generate_deepseek\r\n                response = generate_deepseek_response(prompt, **params)\r\n                think_content, main_response = extract_think_content(response)\r\n                if think_content.\r\n                    st.write(think_content)\r\n\r\n            status_container.update(label=\"Thoughts\", state=\"complete\", expanded=False)\r\n            st.markdown(main_response)\r\n            st.session_state.messages.append({\"role\": \"assistant\", \"content\": main_response})<\/code><\/pre>\n<p>Putting these code blocks together, we get the DeepSeek-R1 chatbot!<\/p>\n<p><strong>6. Concluding remarks<\/strong><\/p>\n<p>Build your own chatbot powered by the powerful DeepSeek-R1 model. This is impressively implemented in less than 100 lines of code.<\/p>\n<p>You may notice that a large portion of the code involves the handling of \"think\" tags and a lot of inline comments, which, if removed, would make the application much smaller.<\/p>","protected":false},"excerpt":{"rendered":"<p>The pace of progress in the AI area is indeed moving at an unprecedented rate. In just over a week, the release of the DeepSeek-R1 LLM model has shocked the AI world with its impressive accuracy, which is comparable to that of existing models, but the creation cost is only a fraction of the typical cost. The DeepSeek team succeeded in distilling the reasoning of its large 671B parameter model into six small models based on Qwen (DeepSeek-R1-Distilla-Qwen-1.5B, 7B, 14B and 32B) and Llama (DeepSeek-R1-Distilla-Llama-8B and 70B). It actually means you can use it<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[149,144],"tags":[3606,2352,5676,275],"collection":[5669],"class_list":["post-28416","post","type-post","status-publish","format-standard","hentry","category-jiaocheng","category-baike","tag-deepseek","tag-python","tag-5676","tag-275","collection-deepseek"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.1ai.net\/en\/wp-json\/wp\/v2\/posts\/28416","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.1ai.net\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.1ai.net\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.1ai.net\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.1ai.net\/en\/wp-json\/wp\/v2\/comments?post=28416"}],"version-history":[{"count":0,"href":"https:\/\/www.1ai.net\/en\/wp-json\/wp\/v2\/posts\/28416\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.1ai.net\/en\/wp-json\/wp\/v2\/media?parent=28416"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.1ai.net\/en\/wp-json\/wp\/v2\/categories?post=28416"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.1ai.net\/en\/wp-json\/wp\/v2\/tags?post=28416"},{"taxonomy":"collection","embeddable":true,"href":"https:\/\/www.1ai.net\/en\/wp-json\/wp\/v2\/collection?post=28416"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}