👤
无需 API 密钥,使用 DeepSeek 模型体验铸渊助手。
@@ -353,7 +382,7 @@ footer{padding:12px 18px 16px;padding-bottom:max(16px,env(safe-area-inset-bottom
-
+
🔒 API 密钥仅本次会话有效,关闭标签页即自动清除
@@ -614,22 +643,22 @@ footer{padding:12px 18px 16px;padding-bottom:max(16px,env(safe-area-inset-bottom
🚀 怎么开始用
- 打开链接 https://qinfendebingshuo.github.io/guanghulab/
- - 选择「👤 访客模式」直接体验,或「🔑 编号登录」开发者身份登录
- - 编号登录:选择你的身份,输入 API 端点 和 API 密钥,点「🔍 检测模型」
- - 系统自动检测可用模型列表,选择你要用的模型
- - 点「开始对话」,铸渊会针对你的身份打招呼
+ - 选择「🏠 团队登录」选择你的开发者编号,无需 API 密钥
+ - 系统自动使用服务器端 API 代理,128k 完整上下文
+ - 点「进入铸渊对话」,铸渊会针对你的身份打招呼
+ - 也可用「👤 访客模式」体验,或「🔧 自定义 API」使用自己的密钥
-
🔑 从哪里获取 API Key?
+
🏠 团队登录说明
-
推荐用云雾 AI(团队共用)
-
找冰朔或肥猫获取团队 Key 和端点地址,输入后点「🔍 检测模型」即可使用。
+
团队成员(推荐)
+
选择「🏠 团队登录」→ 选择你的开发者编号 → 直接进入对话。无需 API 密钥,系统使用服务器端代理。
-
没有 Key?用访客模式
-
登录页选择「👤 访客模式」进入演示,可查看团队进度面板(🦁 指挥台),AI 回答功能受限。
+
没有开发者编号?用访客模式
+
登录页选择「👤 访客模式」进入体验,可查看团队进度面板(🦁 指挥台),AI 回答功能受限。
@@ -772,6 +801,19 @@ const GUEST_API = {
rateLimit: { maxPerMin: 6, count: 0, resetAt: 0 },
};
+// ═══════════════════════════════════════════════════════
+// 团队模式 API 配置(服务器端代理 · 无需用户提供 API 密钥)
+// 通过 api-proxy 中转,密钥由服务器环境变量 YUNWU_API_KEY 管理
+// 团队成员享有完整 128k 上下文 + 更高 token 限制
+// ═══════════════════════════════════════════════════════
+const TEAM_API = {
+ proxyUrl: '/api/chat',
+ model: 'deepseek-chat',
+ provider: 'yunwu',
+ maxTokens: 2000,
+ temperature: 0.8,
+};
+
const FB_BRAIN = {
identity:'铸渊(Zhùyuān)· GitHub 代码守护人格体',
wake_triggers:['我是冰朔','冰朔','我是妈妈','唤醒铸渊','铸渊,醒来'],
@@ -788,6 +830,7 @@ const A = {
mdl: ls('zy_mdl')||'',
prov: 'custom',
demo: false,
+ teamMode: ls('zy_teammode')==='1',
brain: null,
routing: null,
devStatus: null,
@@ -1207,11 +1250,15 @@ function initSetupUI(){
function switchLoginMode(mode){
document.querySelectorAll('.login-tab').forEach(function(t){t.classList.remove('active');});
document.querySelectorAll('.login-mode').forEach(function(m){m.classList.remove('active');});
- if(mode==='guest'){
- document.querySelector('.login-tab:first-child').classList.add('active');
+ var tabs = document.querySelectorAll('.login-tab');
+ if(mode==='team'){
+ tabs[0].classList.add('active');
+ document.getElementById('login-team').classList.add('active');
+ } else if(mode==='guest'){
+ tabs[1].classList.add('active');
document.getElementById('login-guest').classList.add('active');
} else {
- document.querySelector('.login-tab:last-child').classList.add('active');
+ tabs[2].classList.add('active');
document.getElementById('login-dev').classList.add('active');
}
}
@@ -1316,12 +1363,46 @@ function doSetup(){
}
function doDemo(){
- A.demo=true; A.key=''; A.prov='custom';
+ A.demo=true; A.teamMode=false; A.key=''; A.prov='custom';
A.mdl=GUEST_API.model;
+ lss('zy_teammode','0');
setIdentity('', '');
showApp();
}
+function updateTeamIdPreview(){
+ const un = document.getElementById('tuid').value;
+ const el = document.getElementById('team-id-preview');
+ if(!un||!el) return;
+ const meta = ROLE_MAP[un];
+ if(meta){
+ el.innerHTML = '
'
+ + meta.emoji+' '+esc(un)+' · '+meta.title
+ + (meta.devId ? ' · '+meta.devId+'' : '')
+ + '
✅ 使用服务器端 API 代理 · 128k 上下文 · 无需密钥'
+ + '
';
+ } else {
+ el.innerHTML = '';
+ }
+}
+
+function doTeamLogin(){
+ const un = document.getElementById('tuid').value;
+ if(!un){
+ alert('请选择你的开发者身份');
+ return;
+ }
+ // 团队模式:使用服务器代理,不需要 API 密钥
+ A.demo = true;
+ A.teamMode = true;
+ A.key = '';
+ A.prov = 'custom';
+ A.mdl = TEAM_API.model;
+ lss('zy_teammode','1');
+ setIdentity(un, '');
+ showApp();
+}
+
// ═══════════════════════════════════════════════════════
// SETTINGS PANEL
// ═══════════════════════════════════════════════════════
@@ -1606,7 +1687,13 @@ async function send(){
setMode(detectMode(txt));
userMsg(txt);
if(A.demo){
- if(GUEST_API.enabled){
+ if(A.teamMode){
+ try{ await teamStreamReply(txt); }
+ catch(e){ console.warn('[团队API] 降级到访客模式:',e.message);
+ try{ await guestStreamReply(txt); }
+ catch(e2){ await demoReply(txt); }
+ }
+ } else if(GUEST_API.enabled){
try{ await guestStreamReply(txt); }
catch(e){ console.warn('[访客API] 降级到演示模式:',e.message); await demoReply(txt); }
} else {
@@ -1688,6 +1775,69 @@ async function streamReply(txt){
}
}
+// ═══════════════════════════════════════════════════════
+// TEAM API STREAMING(团队模式 · 服务器端代理 · 128k 上下文)
+// 使用服务器端 YUNWU_API_KEY,无需用户提供密钥
+// ═══════════════════════════════════════════════════════
+async function teamStreamReply(txt){
+ A.streaming=true;
+ A.msgs.push({role:'user',content:txt});
+ updSendBtn();
+ const el=addStreamBubble();
+
+ // Resolve proxy URL (relative or absolute)
+ let proxyUrl=TEAM_API.proxyUrl;
+ if(proxyUrl.startsWith('/')){
+ proxyUrl=location.origin+proxyUrl;
+ }
+
+ const reqBody={
+ provider: TEAM_API.provider,
+ model: TEAM_API.model,
+ messages: trimMessagesForContext([{role:'system',content:sysPrompt()}], A.msgs, false),
+ stream: true,
+ temperature: TEAM_API.temperature,
+ max_tokens: TEAM_API.maxTokens,
+ };
+
+ const res=await fetch(proxyUrl,{
+ method:'POST',
+ headers:{'Content-Type':'application/json'},
+ body:JSON.stringify(reqBody),
+ });
+
+ if(!res.ok){
+ let em='[团队API] 返回错误 '+res.status;
+ try{const e=await res.json();em=e.message||em;}catch(_){}
+ throw new Error(em);
+ }
+
+ let full='';
+ const rdr=res.body.getReader();
+ const dec=new TextDecoder();
+ let buf='';
+ while(true){
+ const{done,value}=await rdr.read();
+ if(done) break;
+ buf+=dec.decode(value,{stream:true});
+ const lines=buf.split('\n'); buf=lines.pop();
+ for(const line of lines){
+ if(!line.startsWith('data: ')) continue;
+ const d=line.slice(6);
+ if(d==='[DONE]') continue;
+ try{
+ const p=JSON.parse(d);
+ const delta=p.choices?.[0]?.delta?.content||'';
+ if(delta){full+=delta;el.innerHTML=md(full)+'
▋';scrollB();}
+ }catch(_){}
+ }
+ }
+ el.innerHTML=md(full);
+ A.msgs.push({role:'assistant',content:full});
+ addCopyBtns(el);
+ A.streaming=false; updSendBtn(); scrollB();
+}
+
// ═══════════════════════════════════════════════════════
// GUEST API STREAMING (通过 api-proxy 调用 DeepSeek)
// 铸渊人格体系统提示词始终激活,不降级为通用助手