How to Build a QwenPaw Agent Workspace with Custom Skills, Model Providers, Console Access, and Streaming API Testing

Editor
2 Min Read


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)
Share this Article
Please enter CoinGecko Free Api Key to get this plugin works.