Commit f182fbd1 authored by Your Name's avatar Your Name

All working but qwen-oauth2

parent 8b50a0ae
{
"name": ".kilo",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"dependencies": {
"@kilocode/plugin": "7.2.14"
}
},
"node_modules/@kilocode/plugin": {
"version": "7.2.14",
"resolved": "https://registry.npmjs.org/@kilocode/plugin/-/plugin-7.2.14.tgz",
"integrity": "sha512-mS+WA9HZIBH2qQ9ARA+v0q4MdQTSdfOvKbe4AOSkjP+P5hVA70OM/UVM9DVcvmjSOxU+wuUxmOy+j/EQIrgFmw==",
"license": "MIT",
"dependencies": {
"@kilocode/sdk": "7.2.14",
"zod": "4.1.8"
},
"peerDependencies": {
"@opentui/core": ">=0.1.97",
"@opentui/solid": ">=0.1.97"
},
"peerDependenciesMeta": {
"@opentui/core": {
"optional": true
},
"@opentui/solid": {
"optional": true
}
}
},
"node_modules/@kilocode/sdk": {
"version": "7.2.14",
"resolved": "https://registry.npmjs.org/@kilocode/sdk/-/sdk-7.2.14.tgz",
"integrity": "sha512-Naz83lFrsbavuDp6UwxRuglOaSNvRBsZfcRNvb7RpWYAwbuJP0dBdhpXj6uO3ta5qxeQ2JzxKNC9Ffz+LCLLDg==",
"license": "MIT",
"dependencies": {
"cross-spawn": "7.0.6"
}
},
"node_modules/cross-spawn": {
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"license": "MIT",
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
"which": "^2.0.1"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"license": "ISC"
},
"node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"license": "MIT",
"dependencies": {
"shebang-regex": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/shebang-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"license": "ISC",
"dependencies": {
"isexe": "^2.0.0"
},
"bin": {
"node-which": "bin/node-which"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/zod": {
"version": "4.1.8",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/colinhacks"
}
}
}
}
This diff is collapsed.
...@@ -25,6 +25,7 @@ import asyncio ...@@ -25,6 +25,7 @@ import asyncio
import time import time
import json import json
import platform import platform
import uuid
from typing import Dict, List, Optional, Union from typing import Dict, List, Optional, Union
from openai import AsyncOpenAI from openai import AsyncOpenAI
from ..models import Model from ..models import Model
...@@ -130,19 +131,35 @@ class QwenProviderHandler(BaseProviderHandler): ...@@ -130,19 +131,35 @@ class QwenProviderHandler(BaseProviderHandler):
logger.info("QwenProviderHandler: Using OAuth2 authentication") logger.info("QwenProviderHandler: Using OAuth2 authentication")
auth_key = access_token auth_key = access_token
# Use provider configured endpoint for OAuth2 (fixed endpoints) # Get resource URL from auth and normalize it properly
base_url = self.provider_config.endpoint base_url = self.auth.get_resource_url()
# Normalize endpoint exactly as specified in documentation
if not base_url.startswith("http"):
base_url = f"https://{base_url}"
if not base_url.endswith("/v1"):
base_url = f"{base_url}/v1"
logger.info(f"QwenProviderHandler: Final endpoint: {base_url}")
# Normalize endpoint # Build required DashScope headers
if not base_url.startswith("http"): import uuid
base_url = f"https://{base_url}" user_agent = f"QwenCode/1.0.0 ({platform.system().lower()}; {platform.machine()})"
# DashScope endpoint already includes /v1 so do not append again default_headers = {
"Accept": "application/json",
"X-DashScope-CacheControl": "enable",
"X-DashScope-UserAgent": user_agent,
"X-DashScope-AuthType": "qwen-oauth",
"x-request-id": str(uuid.uuid4()),
}
self._sdk_client = AsyncOpenAI( self._sdk_client = AsyncOpenAI(
api_key=auth_key, api_key=auth_key,
base_url=base_url, base_url=base_url,
max_retries=3, max_retries=3,
timeout=httpx.Timeout(300.0, connect=30.0), timeout=httpx.Timeout(300.0, connect=30.0),
default_headers=default_headers,
) )
logger.info(f"QwenProviderHandler: Created SDK client (endpoint: {base_url})") logger.info(f"QwenProviderHandler: Created SDK client (endpoint: {base_url})")
...@@ -223,12 +240,22 @@ class QwenProviderHandler(BaseProviderHandler): ...@@ -223,12 +240,22 @@ class QwenProviderHandler(BaseProviderHandler):
# Get SDK client with current OAuth token # Get SDK client with current OAuth token
client = await self._get_sdk_client() client = await self._get_sdk_client()
# Generate session tracking IDs
session_id = str(uuid.uuid4())
prompt_id = str(uuid.uuid4())
# Build request parameters # Build request parameters
request_params = { request_params = {
"model": model, "model": model,
"messages": messages, "messages": messages,
"max_tokens": max_tokens or 4096, "max_tokens": max_tokens or 4096,
"stream": stream, "stream": stream,
"extra_body": {
"metadata": {
"sessionId": session_id,
"promptId": prompt_id
}
}
} }
if temperature is not None and temperature > 0: if temperature is not None and temperature > 0:
...@@ -240,6 +267,10 @@ class QwenProviderHandler(BaseProviderHandler): ...@@ -240,6 +267,10 @@ class QwenProviderHandler(BaseProviderHandler):
if tool_choice and tools: if tool_choice and tools:
request_params["tool_choice"] = tool_choice request_params["tool_choice"] = tool_choice
# Add stream_options for streaming requests
if stream:
request_params["stream_options"] = {"include_usage": True}
try: try:
if stream: if stream:
logger.info("QwenProviderHandler: Using streaming mode") logger.info("QwenProviderHandler: Using streaming mode")
...@@ -440,16 +471,37 @@ class QwenProviderHandler(BaseProviderHandler): ...@@ -440,16 +471,37 @@ class QwenProviderHandler(BaseProviderHandler):
using_api_key = qwen_config and isinstance(qwen_config, dict) and qwen_config.get('api_key') using_api_key = qwen_config and isinstance(qwen_config, dict) and qwen_config.get('api_key')
if not using_api_key: if not using_api_key:
# OAuth2 authentication: return fixed model list # OAuth2 authentication: return full model list
logger.info("QwenProviderHandler: Using OAuth2 authentication, returning fixed model list") logger.info("QwenProviderHandler: Using OAuth2 authentication, returning full model list")
return [ return [
Model( Model(
id="coder-model", id="qwen-turbo",
name="Coder Model", name="Qwen Turbo",
provider_id=self.provider_id, provider_id=self.provider_id,
context_size=1000000, context_size=32000,
context_length=1000000, context_length=32000,
) ),
Model(
id="qwen-plus",
name="Qwen Plus",
provider_id=self.provider_id,
context_size=128000,
context_length=128000,
),
Model(
id="qwen-max",
name="Qwen Max",
provider_id=self.provider_id,
context_size=128000,
context_length=128000,
),
Model(
id="qwen3-coder-plus",
name="Qwen 3 Coder Plus",
provider_id=self.provider_id,
context_size=128000,
context_length=128000,
),
] ]
# API token authentication: fetch from models endpoint # API token authentication: fetch from models endpoint
...@@ -502,10 +554,10 @@ class QwenProviderHandler(BaseProviderHandler): ...@@ -502,10 +554,10 @@ class QwenProviderHandler(BaseProviderHandler):
# Fallback to static model list # Fallback to static model list
logger.warning("QwenProviderHandler: No models returned from API, using static list") logger.warning("QwenProviderHandler: No models returned from API, using static list")
models = [ models = [
Model(id="qwen-plus", name="Qwen Plus", provider_id=self.provider_id, context_size=32000), Model(id="qwen-turbo", name="Qwen Turbo", provider_id=self.provider_id, context_size=32000),
Model(id="qwen-turbo", name="Qwen Turbo", provider_id=self.provider_id, context_size=8000), Model(id="qwen-plus", name="Qwen Plus", provider_id=self.provider_id, context_size=128000),
Model(id="qwen-max", name="Qwen Max", provider_id=self.provider_id, context_size=8000), Model(id="qwen-max", name="Qwen Max", provider_id=self.provider_id, context_size=128000),
Model(id="coder-model", name="Qwen Coder", provider_id=self.provider_id, context_size=32000), Model(id="qwen3-coder-plus", name="Qwen 3 Coder Plus", provider_id=self.provider_id, context_size=128000),
] ]
logger.info(f"QwenProviderHandler: Returning {len(models)} models") logger.info(f"QwenProviderHandler: Returning {len(models)} models")
...@@ -517,8 +569,8 @@ class QwenProviderHandler(BaseProviderHandler): ...@@ -517,8 +569,8 @@ class QwenProviderHandler(BaseProviderHandler):
# Return static fallback list # Return static fallback list
logger.info("QwenProviderHandler: Using static fallback model list") logger.info("QwenProviderHandler: Using static fallback model list")
return [ return [
Model(id="qwen-plus", name="Qwen Plus", provider_id=self.provider_id, context_size=32000), Model(id="qwen-turbo", name="Qwen Turbo", provider_id=self.provider_id, context_size=32000),
Model(id="qwen-turbo", name="Qwen Turbo", provider_id=self.provider_id, context_size=8000), Model(id="qwen-plus", name="Qwen Plus", provider_id=self.provider_id, context_size=128000),
Model(id="qwen-max", name="Qwen Max", provider_id=self.provider_id, context_size=8000), Model(id="qwen-max", name="Qwen Max", provider_id=self.provider_id, context_size=128000),
Model(id="coder-model", name="Qwen Coder", provider_id=self.provider_id, context_size=32000), Model(id="qwen3-coder-plus", name="Qwen 3 Coder Plus", provider_id=self.provider_id, context_size=128000),
] ]
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment