How to Build a QwenPaw Agent Workspace with Custom Skills, Model Providers, Console Access, and Streaming API Testing
if not (WORKING_DIR / “config.json”).exists():
run(qwenpaw_cmd(“init”, “–defaults”), check=False)
else:
print(“QwenPaw working directory already initialized:”, WORKING_DIR)
provider_candidates = [
{
“env”: “OPENAI_API_KEY”,
“provider_id”: “openai”,
“name”: “OpenAI”,
“base_url”: “https://api.openai.com/v1”,
“model”: os.environ.get(“QWENPAW_MODEL”, “gpt-4o-mini”),
“chat_model”: “OpenAIChatModel”,
“prefix”: “sk-“,
},
{
“env”: “OPENROUTER_API_KEY”,
“provider_id”: “openrouter”,
“name”: “OpenRouter”,
“base_url”: “https://openrouter.ai/api/v1”,
“model”: os.environ.get(“QWENPAW_MODEL”, “openai/gpt-4o-mini”),
“chat_model”: “OpenAIChatModel”,
“prefix”: “sk-or-“,
},
{
“env”: “DASHSCOPE_API_KEY”,
“provider_id”: “dashscope”,
“name”: “DashScope”,
“base_url”: “https://dashscope.aliyuncs.com/compatible-mode/v1”,
“model”: os.environ.get(“QWENPAW_MODEL”, “qwen-plus”),
“chat_model”: “OpenAIChatModel”,
“prefix”: “sk-“,
},
{
“env”: “DEEPSEEK_API_KEY”,
“provider_id”: “deepseek”,
“name”: “DeepSeek”,
“base_url”: “https://api.deepseek.com”,
“model”: os.environ.get(“QWENPAW_MODEL”, “deepseek-chat”),
“chat_model”: “OpenAIChatModel”,
“prefix”: “sk-“,
},
{
“env”: “GEMINI_API_KEY”,
“provider_id”: “gemini”,
“name”: “Google Gemini”,
“base_url”: “https://generativelanguage.googleapis.com”,
“model”: os.environ.get(“QWENPAW_MODEL”, “gemini-2.5-flash”),
“chat_model”: “GeminiChatModel”,
“prefix”: “”,
},
{
“env”: “GOOGLE_API_KEY”,
“provider_id”: “gemini”,
“name”: “Google Gemini”,
“base_url”: “https://generativelanguage.googleapis.com”,
“model”: os.environ.get(“QWENPAW_MODEL”, “gemini-2.5-flash”),
“chat_model”: “GeminiChatModel”,
“prefix”: “”,
},
]
selected = None
for candidate in provider_candidates:
api_key = colab_secret_or_env(candidate[“env”])
if api_key:
selected = {**candidate, “api_key”: api_key}
break
def read_json(path, default):
try:
if path.exists():
return json.loads(path.read_text(encoding=”utf-8″))
except Exception:
pass
return default
def write_json(path, data):
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(json.dumps(data, indent=2, ensure_ascii=False), encoding=”utf-8″)
config_path = WORKING_DIR / “config.json”
config = read_json(config_path, {})
config.setdefault(“agents”, {})
config[“agents”].setdefault(“active_agent”, “default”)
config[“agents”].setdefault(“agent_order”, [“default”])
config[“agents”].setdefault(“profiles”, {})
config[“agents”][“profiles”].setdefault(“default”, {})
config[“agents”][“profiles”][“default”].update(
{
“id”: “default”,
“name”: “Colab Research Assistant”,
“description”: “A QwenPaw agent configured for Google Colab tutorials, local files, custom skills, and API testing.”,
“workspace_dir”: str(WORKSPACE_DIR),
“enabled”: True,
}
)
config[“last_api”] = {“host”: “127.0.0.1”, “port”: PORT}
config[“show_tool_details”] = True
config[“user_timezone”] = “Asia/Kolkata”
write_json(config_path, config)
run(qwenpaw_cmd(“init”, “–defaults”), check=False)
else:
print(“QwenPaw working directory already initialized:”, WORKING_DIR)
provider_candidates = [
{
“env”: “OPENAI_API_KEY”,
“provider_id”: “openai”,
“name”: “OpenAI”,
“base_url”: “https://api.openai.com/v1”,
“model”: os.environ.get(“QWENPAW_MODEL”, “gpt-4o-mini”),
“chat_model”: “OpenAIChatModel”,
“prefix”: “sk-“,
},
{
“env”: “OPENROUTER_API_KEY”,
“provider_id”: “openrouter”,
“name”: “OpenRouter”,
“base_url”: “https://openrouter.ai/api/v1”,
“model”: os.environ.get(“QWENPAW_MODEL”, “openai/gpt-4o-mini”),
“chat_model”: “OpenAIChatModel”,
“prefix”: “sk-or-“,
},
{
“env”: “DASHSCOPE_API_KEY”,
“provider_id”: “dashscope”,
“name”: “DashScope”,
“base_url”: “https://dashscope.aliyuncs.com/compatible-mode/v1”,
“model”: os.environ.get(“QWENPAW_MODEL”, “qwen-plus”),
“chat_model”: “OpenAIChatModel”,
“prefix”: “sk-“,
},
{
“env”: “DEEPSEEK_API_KEY”,
“provider_id”: “deepseek”,
“name”: “DeepSeek”,
“base_url”: “https://api.deepseek.com”,
“model”: os.environ.get(“QWENPAW_MODEL”, “deepseek-chat”),
“chat_model”: “OpenAIChatModel”,
“prefix”: “sk-“,
},
{
“env”: “GEMINI_API_KEY”,
“provider_id”: “gemini”,
“name”: “Google Gemini”,
“base_url”: “https://generativelanguage.googleapis.com”,
“model”: os.environ.get(“QWENPAW_MODEL”, “gemini-2.5-flash”),
“chat_model”: “GeminiChatModel”,
“prefix”: “”,
},
{
“env”: “GOOGLE_API_KEY”,
“provider_id”: “gemini”,
“name”: “Google Gemini”,
“base_url”: “https://generativelanguage.googleapis.com”,
“model”: os.environ.get(“QWENPAW_MODEL”, “gemini-2.5-flash”),
“chat_model”: “GeminiChatModel”,
“prefix”: “”,
},
]
selected = None
for candidate in provider_candidates:
api_key = colab_secret_or_env(candidate[“env”])
if api_key:
selected = {**candidate, “api_key”: api_key}
break
def read_json(path, default):
try:
if path.exists():
return json.loads(path.read_text(encoding=”utf-8″))
except Exception:
pass
return default
def write_json(path, data):
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(json.dumps(data, indent=2, ensure_ascii=False), encoding=”utf-8″)
config_path = WORKING_DIR / “config.json”
config = read_json(config_path, {})
config.setdefault(“agents”, {})
config[“agents”].setdefault(“active_agent”, “default”)
config[“agents”].setdefault(“agent_order”, [“default”])
config[“agents”].setdefault(“profiles”, {})
config[“agents”][“profiles”].setdefault(“default”, {})
config[“agents”][“profiles”][“default”].update(
{
“id”: “default”,
“name”: “Colab Research Assistant”,
“description”: “A QwenPaw agent configured for Google Colab tutorials, local files, custom skills, and API testing.”,
“workspace_dir”: str(WORKSPACE_DIR),
“enabled”: True,
}
)
config[“last_api”] = {“host”: “127.0.0.1”, “port”: PORT}
config[“show_tool_details”] = True
config[“user_timezone”] = “Asia/Kolkata”
write_json(config_path, config)


