{"record":{"id":"0c51d57b7299583c","repo":"ruvnet/ruflo","slug":"streaming-not-supported","errorCode":"STREAMING_NOT_SUPPORTED","errorMessage":"Streaming not supported","messagePattern":"Streaming not supported","errorType":"exception","errorClass":"LLMProviderError","httpStatus":null,"severity":"warning","filePath":"v3/@claude-flow/providers/src/base-provider.ts","lineNumber":261,"sourceCode":"    }\n  }\n\n  /**\n   * Provider-specific completion (override in subclass)\n   */\n  protected abstract doComplete(request: LLMRequest): Promise<LLMResponse>;\n\n  /**\n   * Stream complete a request\n   */\n  async *streamComplete(request: LLMRequest): AsyncIterable<LLMStreamEvent> {\n    const startTime = Date.now();\n    let totalTokens = 0;\n    let totalCost = 0;\n\n    try {\n      if (!this.capabilities.supportsStreaming) {\n        throw new LLMProviderError(\n          'Streaming not supported',\n          'STREAMING_NOT_SUPPORTED',\n          this.name,\n          undefined,\n          false\n        );\n      }\n\n      const stream = await this.circuitBreaker.execute(async () => {\n        return this.doStreamComplete(request);\n      });\n\n      for await (const event of stream) {\n        if (event.usage) {\n          totalTokens = event.usage.totalTokens;\n        }\n        if (event.cost) {\n          totalCost = event.cost.totalCost;","sourceCodeStart":243,"sourceCodeEnd":279,"githubUrl":"https://github.com/ruvnet/ruflo/blob/fa13ee4ad60ac2090b1480656eb233521790d640/v3/@claude-flow/providers/src/base-provider.ts#L243-L279","documentation":"streamComplete() on BaseProvider checks this.capabilities.supportsStreaming before delegating to the provider; when the provider declared no streaming support it throws LLMProviderError with code STREAMING_NOT_SUPPORTED and retryable=false. The check runs per call, before the circuit breaker is invoked.","triggerScenarios":"Calling provider.streamComplete(request) on a provider instance whose capabilities object sets supportsStreaming: false - for example a provider registered without streaming, or a custom subclass that forgot to declare it.","commonSituations":"Generic chat-UI code that always streams run against a provider that only supports buffered completion; integration tests streaming against a stub provider; a custom provider subclass implementing doComplete but not doStreamComplete.","solutions":["Call complete() instead and consume the whole LLMResponse, emitting chunks yourself if a stream shape is required downstream","Switch to a provider whose capabilities.supportsStreaming is true","If you control the subclass, set supportsStreaming: true in capabilities and implement doStreamComplete"],"exampleFix":"// before\nfor await (const ev of provider.streamComplete(req)) { /* ... */ } // throws STREAMING_NOT_SUPPORTED\n\n// after\nif (provider.capabilities.supportsStreaming) {\n  for await (const ev of provider.streamComplete(req)) { /* ... */ }\n} else {\n  const res = await provider.complete(req);\n  handleChunk(res.content); // degrade to a single-chunk 'stream'\n}","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"function supportsStreaming(p: ILLMProvider): boolean {\n  return p.capabilities.supportsStreaming === true;\n}","tryCatchPattern":"try {\n  for await (const ev of provider.streamComplete(req)) { handle(ev); }\n} catch (e) {\n  if (e instanceof LLMProviderError && e.code === 'STREAMING_NOT_SUPPORTED') {\n    const res = await provider.complete(req); // graceful degradation\n    handle({ type: 'chunk', text: res.content } as LLMStreamEvent);\n    return;\n  }\n  throw e;\n}","preventionTips":["Feature-detect provider.capabilities.supportsStreaming before choosing stream vs buffered call","Keep a non-streaming fallback path in generic pipelines that must work with any provider","When subclassing BaseProvider, declare capabilities that match the doStreamComplete implementation"],"tags":["streaming","capabilities","feature-unsupported"],"backgroundTag":"feature-not-supported","analyzedSha":"fa13ee4ad60ac2090b1480656eb233521790d640","analyzedAt":"2026-08-18T21:34:22.708Z","contentChangedAt":"2026-08-18T21:34:22.708Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}