Allow async streamFn for dynamic proxy settings

- StreamFn type now allows returning Promise
- agent-loop awaits streamFn result
- createStreamFn takes getProxyUrl callback, reads settings on each call
This commit is contained in:
Mario Zechner 2025-12-28 11:39:46 +01:00
parent e0be2e650d
commit 92898f486b
4 changed files with 16 additions and 11 deletions

View file

@ -161,10 +161,6 @@ const createAgent = async (initialState?: Partial<AgentState>) => {
agentUnsubscribe();
}
// Read proxy settings for streamFn
const proxyEnabled = await storage.settings.get<boolean>("proxy.enabled");
const proxyUrl = proxyEnabled ? (await storage.settings.get<string>("proxy.url")) || undefined : undefined;
agent = new Agent({
initialState: initialState || {
systemPrompt: `You are a helpful AI assistant with access to various tools.
@ -186,8 +182,11 @@ Feel free to use these tools when needed to provide accurate and helpful respons
const key = await storage.providerKeys.get(provider);
return key ?? undefined;
},
// Use streamFn with CORS proxy support
streamFn: createStreamFn(proxyUrl),
// Use streamFn with CORS proxy support (reads settings on each call)
streamFn: createStreamFn(async () => {
const enabled = await storage.settings.get<boolean>("proxy.enabled");
return enabled ? (await storage.settings.get<string>("proxy.url")) || undefined : undefined;
}),
});
agentUnsubscribe = agent.subscribe((event: any) => {

View file

@ -114,13 +114,16 @@ export function isCorsError(error: unknown): boolean {
/**
* Create a streamFn that applies CORS proxy when needed.
* Reads proxy settings from storage on each call.
*
* @param proxyUrl - CORS proxy URL, or undefined to disable
* @param getProxyUrl - Async function to get current proxy URL (or undefined if disabled)
* @returns A streamFn compatible with Agent's streamFn option
*/
export function createStreamFn(proxyUrl?: string) {
return (model: Model<any>, context: Context, options?: SimpleStreamOptions) => {
export function createStreamFn(getProxyUrl: () => Promise<string | undefined>) {
return async (model: Model<any>, context: Context, options?: SimpleStreamOptions) => {
const apiKey = options?.apiKey;
const proxyUrl = await getProxyUrl();
if (!apiKey || !proxyUrl) {
return streamSimple(model, context, options);
}