WeKnora deployment source with the reviewed wiki identity, summary and recovery fixes
Anydoc / anydoc parser engine (push) Canceled after 0s
App / Format, vet, test, and build (push) Canceled after 0s
CLI / test (macos-latest / go 1.26) (push) Canceled after 0s
CLI / test (ubuntu-latest / go 1.26) (push) Canceled after 0s
CLI / test (windows-latest / go 1.26) (push) Canceled after 0s
Build and Push Docker Image / build-ui (push) Canceled after 0s
Build and Push Docker Image / build-docreader (push) Canceled after 0s
Build and Push Docker Image / build-sandbox (push) Canceled after 0s
Build and Push Docker Image / build-app (amd64, linux/amd64, ubuntu-latest) (push) Canceled after 0s
Build and Push Docker Image / build-app (arm64, linux/arm64, ubuntu-24.04-arm) (push) Canceled after 0s
DocReader / Python tests and Go client tests (push) Canceled after 0s
Build & Publish (dsh-weknora) / Typecheck, test, pack (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (pinned) (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (latest, advisory) (push) Canceled after 0s
Frontend / Test, type-check, and build (push) Canceled after 0s
Go Lint Cache / warm lint cache (.) (push) Canceled after 0s
Go Lint Cache / warm lint cache (cli) (push) Canceled after 0s
Go Lint Cache / warm lint cache (client) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.10) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.11) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.12) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.13) (push) Canceled after 0s
Build and Push Docker Image / merge (push) Canceled after 0s
Build & Publish (dsh-weknora) / Publish to npm (push) Canceled after 0s
Build & Publish (mcp-server) / Build sdist + wheel (push) Canceled after 0s
Build & Publish (mcp-server) / Publish to PyPI (push) Canceled after 0s
Anydoc / anydoc parser engine (push) Canceled after 0s
App / Format, vet, test, and build (push) Canceled after 0s
CLI / test (macos-latest / go 1.26) (push) Canceled after 0s
CLI / test (ubuntu-latest / go 1.26) (push) Canceled after 0s
CLI / test (windows-latest / go 1.26) (push) Canceled after 0s
Build and Push Docker Image / build-ui (push) Canceled after 0s
Build and Push Docker Image / build-docreader (push) Canceled after 0s
Build and Push Docker Image / build-sandbox (push) Canceled after 0s
Build and Push Docker Image / build-app (amd64, linux/amd64, ubuntu-latest) (push) Canceled after 0s
Build and Push Docker Image / build-app (arm64, linux/arm64, ubuntu-24.04-arm) (push) Canceled after 0s
DocReader / Python tests and Go client tests (push) Canceled after 0s
Build & Publish (dsh-weknora) / Typecheck, test, pack (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (pinned) (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (latest, advisory) (push) Canceled after 0s
Frontend / Test, type-check, and build (push) Canceled after 0s
Go Lint Cache / warm lint cache (.) (push) Canceled after 0s
Go Lint Cache / warm lint cache (cli) (push) Canceled after 0s
Go Lint Cache / warm lint cache (client) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.10) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.11) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.12) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.13) (push) Canceled after 0s
Build and Push Docker Image / merge (push) Canceled after 0s
Build & Publish (dsh-weknora) / Publish to npm (push) Canceled after 0s
Build & Publish (mcp-server) / Build sdist + wheel (push) Canceled after 0s
Build & Publish (mcp-server) / Publish to PyPI (push) Canceled after 0s
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
package chat
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/Tencent/WeKnora/internal/logger"
|
||||
"github.com/Tencent/WeKnora/internal/types"
|
||||
)
|
||||
|
||||
// debugChat wraps a Chat implementation and logs all calls to the LLM debug log.
|
||||
// It works with both RemoteAPIChat and OllamaChat (or any future Chat impl).
|
||||
type debugChat struct {
|
||||
inner Chat
|
||||
}
|
||||
|
||||
func (d *debugChat) GetModelName() string { return d.inner.GetModelName() }
|
||||
func (d *debugChat) GetModelID() string { return d.inner.GetModelID() }
|
||||
|
||||
func (d *debugChat) Chat(ctx context.Context, messages []Message, opts *ChatOptions) (*types.ChatResponse, error) {
|
||||
callStart := time.Now()
|
||||
resp, err := d.inner.Chat(ctx, messages, opts)
|
||||
logLLMDebugCall(ctx, d.inner.GetModelName(), messages, opts, resp, err, time.Since(callStart))
|
||||
return resp, err
|
||||
}
|
||||
|
||||
func (d *debugChat) ChatStream(ctx context.Context, messages []Message, opts *ChatOptions) (<-chan types.StreamResponse, error) {
|
||||
callStart := time.Now()
|
||||
ch, err := d.inner.ChatStream(ctx, messages, opts)
|
||||
if err != nil {
|
||||
logLLMDebugStream(ctx, d.inner.GetModelName(), messages, opts, "", nil, nil, err, time.Since(callStart))
|
||||
return ch, err
|
||||
}
|
||||
if ch == nil {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
wrapped := make(chan types.StreamResponse)
|
||||
go func() {
|
||||
defer close(wrapped)
|
||||
var content strings.Builder
|
||||
var usage *types.TokenUsage
|
||||
var toolCalls []types.LLMToolCall
|
||||
var streamErr error
|
||||
|
||||
for resp := range ch {
|
||||
if resp.ResponseType == types.ResponseTypeAnswer && resp.Content != "" {
|
||||
content.WriteString(resp.Content)
|
||||
}
|
||||
if resp.ResponseType == types.ResponseTypeError {
|
||||
streamErr = fmt.Errorf("%s", resp.Content)
|
||||
}
|
||||
if resp.Usage != nil {
|
||||
usage = resp.Usage
|
||||
}
|
||||
if len(resp.ToolCalls) > 0 {
|
||||
toolCalls = resp.ToolCalls
|
||||
}
|
||||
wrapped <- resp
|
||||
}
|
||||
|
||||
logLLMDebugStream(ctx, d.inner.GetModelName(), messages, opts,
|
||||
content.String(), toolCalls, usage, streamErr, time.Since(callStart))
|
||||
}()
|
||||
|
||||
return wrapped, nil
|
||||
}
|
||||
|
||||
// wrapChatDebug wraps a Chat if LLM debug logging is enabled.
|
||||
func wrapChatDebug(c Chat, err error) (Chat, error) {
|
||||
if err != nil || !logger.LLMDebugEnabled() {
|
||||
return c, err
|
||||
}
|
||||
return &debugChat{inner: c}, nil
|
||||
}
|
||||
Reference in New Issue
Block a user