支持Anthropic端点客户端x-api-key:\n- /v1/messages读取x-api-key并优先作为客户端授权传递\n- getAnthropicHeaders转发x-api-key并透传anthropic-version\n- CORS允许X-API-Key与anthropic-version
This commit is contained in:
@@ -257,10 +257,13 @@ async function handleDirectResponses(req, res) {
|
|||||||
|
|
||||||
logInfo(`Direct forwarding to ${model.type} endpoint: ${endpoint.base_url}`);
|
logInfo(`Direct forwarding to ${model.type} endpoint: ${endpoint.base_url}`);
|
||||||
|
|
||||||
// Get API key
|
// Get API key - support client x-api-key for anthropic endpoint
|
||||||
let authHeader;
|
let authHeader;
|
||||||
try {
|
try {
|
||||||
authHeader = await getApiKey(req.headers.authorization);
|
const clientAuthFromXApiKey = req.headers['x-api-key']
|
||||||
|
? `Bearer ${req.headers['x-api-key']}`
|
||||||
|
: null;
|
||||||
|
authHeader = await getApiKey(req.headers.authorization || clientAuthFromXApiKey);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
logError('Failed to get API key', error);
|
logError('Failed to get API key', error);
|
||||||
return res.status(500).json({
|
return res.status(500).json({
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ app.use(express.urlencoded({ extended: true, limit: '50mb' }));
|
|||||||
app.use((req, res, next) => {
|
app.use((req, res, next) => {
|
||||||
res.header('Access-Control-Allow-Origin', '*');
|
res.header('Access-Control-Allow-Origin', '*');
|
||||||
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
|
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
|
||||||
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
|
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-API-Key, anthropic-version');
|
||||||
|
|
||||||
if (req.method === 'OPTIONS') {
|
if (req.method === 'OPTIONS') {
|
||||||
return res.sendStatus(200);
|
return res.sendStatus(200);
|
||||||
|
|||||||
@@ -162,8 +162,9 @@ export function getAnthropicHeaders(authHeader, clientHeaders = {}, isStreaming
|
|||||||
const headers = {
|
const headers = {
|
||||||
'accept': 'application/json',
|
'accept': 'application/json',
|
||||||
'content-type': 'application/json',
|
'content-type': 'application/json',
|
||||||
'anthropic-version': '2023-06-01',
|
'anthropic-version': clientHeaders['anthropic-version'] || '2023-06-01',
|
||||||
'x-api-key': 'placeholder',
|
// Prefer client-provided x-api-key for anthropic endpoint format
|
||||||
|
...(clientHeaders['x-api-key'] ? { 'x-api-key': clientHeaders['x-api-key'] } : {}),
|
||||||
'authorization': authHeader || '',
|
'authorization': authHeader || '',
|
||||||
'x-api-provider': 'anthropic',
|
'x-api-provider': 'anthropic',
|
||||||
'x-factory-client': 'cli',
|
'x-factory-client': 'cli',
|
||||||
|
|||||||
Reference in New Issue
Block a user