| layout | default |
|---|---|
| title | Chapter 6: Application Patterns and Safety Boundaries |
| nav_order | 6 |
| parent | Qwen-Agent Tutorial |
Welcome to Chapter 6: Application Patterns and Safety Boundaries. In this part of Qwen-Agent Tutorial: Tool-Enabled Agent Framework with MCP, RAG, and Multi-Modal Workflows, you will build an intuitive mental model first, then move into concrete implementation details and practical production tradeoffs.
This chapter maps application-level patterns and operational caveats.
- explore app patterns like BrowserQwen and code-interpreter flows
- identify safe vs unsafe execution assumptions
- define environment boundaries for production use
- document risk controls for tool-executing agents
- code-interpreter workflows need sandbox hardening
- browser and external-tool integrations need explicit trust boundaries
- production use requires stronger controls than local demos
You now have a safer application-design lens for Qwen-Agent deployments.
Next: Chapter 7: Benchmarking and DeepPlanning Evaluation
The test function in examples/qwen2vl_function_calling.py handles a key part of this chapter's functionality:
def test():
# Config for the model
llm_cfg_oai = {
# Using Qwen2-VL deployed at any openai-compatible service such as vLLM:
# 'model_type': 'qwenvl_oai',
# 'model': 'Qwen2-VL-7B-Instruct',
# 'model_server': 'http://localhost:8000/v1', # api_base
# 'api_key': 'EMPTY',
# Using Qwen2-VL provided by Alibaba Cloud DashScope's openai-compatible service:
# 'model_type': 'qwenvl_oai',
# 'model': 'qwen-vl-max-0809',
# 'model_server': 'https://dashscope.aliyuncs.com/compatible-mode/v1',
# 'api_key': os.getenv('DASHSCOPE_API_KEY'),
# Using Qwen2-VL provided by Alibaba Cloud DashScope:
'model_type': 'qwenvl_dashscope',
'model': 'qwen-vl-max-0809',
'api_key': os.getenv('DASHSCOPE_API_KEY'),
'generate_cfg': {
'max_retries': 10,
'fncall_prompt_type': 'qwen'
}
}
llm = get_chat_model(llm_cfg_oai)
# Initial conversation
messages = [{
'role':
'user',This function is important because it defines how Qwen-Agent Tutorial: Tool-Enabled Agent Framework with MCP, RAG, and Multi-Modal Workflows implements the patterns covered in this chapter.
The add_text function in qwen_server/assistant_server.py handles a key part of this chapter's functionality:
def add_text(history, text):
history = history + [(text, None)]
return history, gr.update(value='', interactive=False)
def rm_text(history):
if not history:
gr.Warning('No input content!')
elif not history[-1][1]:
return history, gr.update(value='', interactive=False)
else:
history = history[:-1] + [(history[-1][0], None)]
return history, gr.update(value='', interactive=False)
def set_url():
lines = []
if not os.path.exists(cache_file_popup_url):
# Only able to remind the situation of first browsing failure
gr.Error('Oops, it seems that the page cannot be opened due to network issues.')
for line in jsonlines.open(cache_file_popup_url):
lines.append(line)
logger.info('The current access page is: ' + lines[-1]['url'])
return lines[-1]['url']
def bot(history):
page_url = set_url()
if not history:This function is important because it defines how Qwen-Agent Tutorial: Tool-Enabled Agent Framework with MCP, RAG, and Multi-Modal Workflows implements the patterns covered in this chapter.
The rm_text function in qwen_server/assistant_server.py handles a key part of this chapter's functionality:
def rm_text(history):
if not history:
gr.Warning('No input content!')
elif not history[-1][1]:
return history, gr.update(value='', interactive=False)
else:
history = history[:-1] + [(history[-1][0], None)]
return history, gr.update(value='', interactive=False)
def set_url():
lines = []
if not os.path.exists(cache_file_popup_url):
# Only able to remind the situation of first browsing failure
gr.Error('Oops, it seems that the page cannot be opened due to network issues.')
for line in jsonlines.open(cache_file_popup_url):
lines.append(line)
logger.info('The current access page is: ' + lines[-1]['url'])
return lines[-1]['url']
def bot(history):
page_url = set_url()
if not history:
yield history
else:
messages = [{'role': 'user', 'content': [{'text': history[-1][0]}, {'file': page_url}]}]
history[-1][1] = ''
try:This function is important because it defines how Qwen-Agent Tutorial: Tool-Enabled Agent Framework with MCP, RAG, and Multi-Modal Workflows implements the patterns covered in this chapter.
The set_url function in qwen_server/assistant_server.py handles a key part of this chapter's functionality:
def set_url():
lines = []
if not os.path.exists(cache_file_popup_url):
# Only able to remind the situation of first browsing failure
gr.Error('Oops, it seems that the page cannot be opened due to network issues.')
for line in jsonlines.open(cache_file_popup_url):
lines.append(line)
logger.info('The current access page is: ' + lines[-1]['url'])
return lines[-1]['url']
def bot(history):
page_url = set_url()
if not history:
yield history
else:
messages = [{'role': 'user', 'content': [{'text': history[-1][0]}, {'file': page_url}]}]
history[-1][1] = ''
try:
response = assistant.run(messages=messages, max_ref_token=server_config.server.max_ref_token)
for rsp in response:
if rsp:
history[-1][1] = rsp[-1]['content']
yield history
except ModelServiceError as ex:
history[-1][1] = str(ex)
yield history
except Exception as ex:
raise ValueError(ex)This function is important because it defines how Qwen-Agent Tutorial: Tool-Enabled Agent Framework with MCP, RAG, and Multi-Modal Workflows implements the patterns covered in this chapter.
flowchart TD
A[test]
B[add_text]
C[rm_text]
D[set_url]
E[bot]
A --> B
B --> C
C --> D
D --> E