Repository Analysis

cloudwego/eino

The ultimate LLM/AI application development framework in Go.

3.7 Likely human-written View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of cloudwego/eino, a Go project with 12,291 GitHub stars. SynthScan v2.0 examined 154,055 lines of code across 357 source files, recording 402 pattern matches distributed across 7 syntactic categories. The overall adjusted score of 3.7 places this repository in the Likely human-written band.

The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).

3.7
Adjusted Score
3.7
Raw Score
100%
Time Factor
2026-07-14
Last Push
12.3K
Stars
Go
Language
154.1K
Lines of Code
357
Files
402
Pattern Hits
2026-07-14
Scan Date
0.00
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.

Severity Breakdown

Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.

CRITICAL 0HIGH 0MEDIUM 61LOW 341

Directory Score Breakdown

This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.

Pattern Findings

The scanner identified 402 distinct pattern matches across 7 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.

Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.

Over-Commented Block323 hits · 322 pts
SeverityFileLineSnippetContext
LOWcallbacks/aspect_inject.go21COMMENT
LOWcallbacks/aspect_inject.go41// })COMMENT
LOWcallbacks/aspect_inject.go61//COMMENT
LOWcallbacks/aspect_inject.go81// the component produces a successful result. Handlers run in registrationCOMMENT
LOWcallbacks/aspect_inject.go121// StreamReader has been returned) are NOT routed through OnError; they surfaceCOMMENT
LOWcallbacks/aspect_inject.go141}COMMENT
LOWcallbacks/aspect_inject.go161// completely replacing any RunInfo and handlers already in ctx.COMMENT
LOWcallbacks/handler_builder.go21COMMENT
LOWcallbacks/handler_builder.go41// if mi != nil {COMMENT
LOWcallbacks/interface.go21)COMMENT
LOWcallbacks/interface.go41type RunInfo = callbacks.RunInfoCOMMENT
LOWcallbacks/interface.go61COMMENT
LOWcallbacks/interface.go81//COMMENT
LOWcallbacks/interface.go101// (e.g. in main or TestMain), before any graph executions begin.COMMENT
LOWcallbacks/interface.go121 // TimingOnError fires when the component returns a non-nil error.COMMENT
LOWcallbacks/interface.go141//COMMENT
LOWcallbacks/doc.go21// - [TimingOnStartWithStreamInput] / [TimingOnEndWithStreamOutput]: streamingCOMMENT
LOWcallbacks/doc.go41// handlers (e.g. from a parent graph), those handlers are inherited by theCOMMENT
LOWcallbacks/doc.go61// return ctxCOMMENT
LOWcallbacks/doc.go81// },COMMENT
LOWcallbacks/doc.go101// start := ctx.Value(startTimeKey{}).(time.Time)COMMENT
LOWcallbacks/doc.go121// never concurrently with graph execution.COMMENT
LOWcompose/graph_call_options.go61//COMMENT
LOWcompose/graph_call_options.go141// DesignateNodeWithPath sets the path of the node(s) to which the option will be applied.COMMENT
LOWcompose/graph_call_options.go161// WithRetrieverOption is a functional option type for retriever component.COMMENT
LOWcompose/resume.go21COMMENT
LOWcompose/resume.go41//COMMENT
LOWcompose/resume.go61// crucial to differentiate which point is being resumed. This is the primary use case for the `isResumeFlow` flag.COMMENT
LOWcompose/resume.go101COMMENT
LOWcompose/checkpoint.go241 return falseCOMMENT
LOWcompose/chain_branch.go81 key2BranchNode: make(map[string]nodeOptionsPair),COMMENT
LOWcompose/chain_branch.go101 return NewChainMultiBranch(func(ctx context.Context, in T) (endNode map[string]bool, err error) {COMMENT
LOWcompose/chain_branch.go141// })COMMENT
LOWcompose/chain_branch.go161 gNode, options := toAgenticModelNode(node, opts...)COMMENT
LOWcompose/chain_branch.go201// AddToolsNode adds a ToolsNode to the branch.COMMENT
LOWcompose/chain_branch.go241// AddEmbedding adds an Embedding node to the branch.COMMENT
LOWcompose/chain_branch.go281// AddIndexer adds an Indexer node to the branch.COMMENT
LOWcompose/chain_parallel.go41// Example:COMMENT
LOWcompose/chain_parallel.go61//COMMENT
LOWcompose/chain_parallel.go81// Model: "gpt-4o",COMMENT
LOWcompose/chain_parallel.go101 gNode, options := toChatTemplateNode(node, append(opts, WithOutputKey(outputKey))...)COMMENT
LOWcompose/chain_parallel.go121// })COMMENT
LOWcompose/chain_parallel.go141COMMENT
LOWcompose/chain_parallel.go181//COMMENT
LOWcompose/chain_parallel.go201}COMMENT
LOWcompose/resume_test.go261 // create a sub graph A, add A to ROOT graph using AddGraphNode.COMMENT
LOWcompose/resume_test.go381 // which is a specific struct type that implements the CompositeInterruptState interface.COMMENT
LOWcompose/resume_test.go841 // - internal graph will naturally append to the AddressCOMMENT
LOWcompose/resume_test.go941COMMENT
LOWcompose/graph.go321// e.g.COMMENT
LOWcompose/graph.go341COMMENT
LOWcompose/graph.go361//COMMENT
LOWcompose/graph.go381COMMENT
LOWcompose/graph.go401 return g.addNode(key, gNode, options)COMMENT
LOWcompose/interrupt.go121//COMMENT
LOWcompose/interrupt.go141// interruptible sub-processes. It bundles multiple sub-interrupt errors into a single errorCOMMENT
LOWcompose/interrupt.go161// Provided mainly for compatibility purpose as the composite node itselfCOMMENT
LOWcompose/chain.go41COMMENT
LOWcompose/chain.go61// 4.3 `multi input chunk & one output` use `r.Collect(ctx, inputReader)`COMMENT
LOWcompose/chain.go141func (c *Chain[I, O]) component() component {COMMENT
263 more matches not shown…
Modern AI Meta-Vocabulary59 hits · 216 pts
SeverityFileLineSnippetContext
MEDIUMcompose/chain_branch.go149// AddAgenticModel adds a agentic.Model node to the branch.COMMENT
MEDIUMcompose/chain_parallel.go73// AddAgenticModel adds a agentic.Model to the parallel.COMMENT
MEDIUMcompose/graph.go355// AddAgenticModelNode add node that implements agentic.Model.COMMENT
MEDIUMcompose/chain.go177// AppendAgenticModel add a agentic.Model node to the chain.COMMENT
MEDIUMcompose/workflow.go92// AddAgenticModelNode adds an agentic model node and returns it.COMMENT
MEDIUMcompose/workflow.go104// AddAgenticChatTemplateNode adds an agentic chat template node and returns it.COMMENT
MEDIUMcompose/workflow.go116// AddAgenticToolsNode adds an agentic tools node and returns it.COMMENT
MEDIUMutils/callbacks/template.go134// AgenticPrompt sets the agentic prompt handler for the handler helper, which will be called when the agentic prompt coCOMMENT
MEDIUMutils/callbacks/template.go140// AgenticModel sets the agentic chat model handler for the handler helper, which will be called when the agentic chat mCOMMENT
MEDIUMutils/callbacks/template.go146// AgenticToolsNode sets the agentic tools node handler for the handler helper, which will be called when the agentic toCOMMENT
MEDIUMutils/callbacks/template.go158// AgenticAgent sets the agentic agent callback handler for the handler helper, which will be called when an agentic ageCOMMENT
MEDIUMutils/callbacks/template.go683// AgenticAgentCallbackHandler handles callbacks for agentic agents using *schema.AgenticMessage.COMMENT
MEDIUMutils/callbacks/template.go684// Use ComponentOfAgenticAgent to filter callback events to agentic-agent-related events.COMMENT
MEDIUMutils/callbacks/template.go686 // OnStart is called when an agentic agent run begins. Return a modified context to propagate values.COMMENT
MEDIUMutils/callbacks/template.go688 // OnEnd is called when an agentic agent run completes. The output's Events iterator should beCOMMENT
MEDIUMutils/callbacks/template.go704// AgenticPromptCallbackHandler is the handler for the agentic prompt callback.COMMENT
MEDIUMutils/callbacks/template.go706 // OnStart is the callback function for the start of the agentic prompt.COMMENT
MEDIUMutils/callbacks/template.go708 // OnEnd is the callback function for the end of the agentic prompt.COMMENT
MEDIUMutils/callbacks/template.go710 // OnError is the callback function for the error of the agentic prompt.COMMENT
MEDIUMutils/callbacks/template.go728// AgenticModelCallbackHandler is the handler for the agentic chat model callback.COMMENT
MEDIUMschema/agentic_message.go661// AgenticMessagesTemplate is the interface for agentic messages template.COMMENT
MEDIUMschema/agentic_message.go662// It's used to render a template to a list of agentic messages.COMMENT
MEDIUMschema/agentic_message.go687// AgenticMessagesPlaceholder can render a placeholder to a list of agentic messages in params.COMMENT
MEDIUMschema/agentic_message.go730// Format returns the agentic messages after rendering by the given formatType.COMMENT
MEDIUMadk/flow.go616// Typed wrapper for the agentic path (TypedAgent[*schema.AgenticMessage]).COMMENT
MEDIUMadk/interface.go86 // AgenticRole indicates the role of the agentic message (assistant, user, system).COMMENT
MEDIUMadk/wrappers_test.go1713// collectAgenticToolEvents filters tool result events from the agentic iterator.COMMENT
MEDIUMadk/wrappers_test.go1734// collectAgenticToolContent extracts text from agentic tool result events.COMMENT
MEDIUMadk/chatmodel.go422// For M = *schema.AgenticMessage, a single-shot chain is used since agentic modelsCOMMENT
MEDIUMadk/chatmodel.go424// are not yet supported for agentic models.COMMENT
MEDIUMadk/chatmodel.go1085 // single-shot: agentic models handle tool calling internallyCOMMENT
MEDIUMadk/middlewares/reduction/reduction.go1169 // tool result message (schema.Tool role or agentic user msg carrying FunctionToolResult)COMMENT
MEDIUMadk/middlewares/reduction/reduction.go1302 // A user-role agentic message that contains any FunctionToolResult blockCOMMENT
MEDIUMadk/prebuilt/deep/deep.go59 // For M = *schema.AgenticMessage, only agentic sub-agents are accepted.COMMENT
MEDIUMcomponents/types.go69 // ComponentOfAgenticPrompt identifies agentic template components.COMMENT
MEDIUMcomponents/types.go73 // ComponentOfAgenticModel identifies agentic model components.COMMENT
MEDIUMcomponents/prompt/interface.go47// AgenticChatTemplate formats variables into a list of agentic messages according to a prompt schema.COMMENT
MEDIUMcomponents/prompt/agentic_chat_template.go76// GetType returns the type of the agentic template (DefaultAgentic).COMMENT
MEDIUMcomponents/prompt/agentic_callback_extra.go28 // Templates is the agentic templates for the callback.COMMENT
MEDIUMcomponents/prompt/agentic_callback_extra.go36 // Result is the agentic result for the callback.COMMENT
MEDIUMcomponents/prompt/agentic_callback_extra.go38 // Templates is the agentic templates for the callback.COMMENT
MEDIUMcomponents/prompt/agentic_callback_extra.go44// ConvAgenticCallbackInput converts the callback input to the agentic prompt callback input.COMMENT
MEDIUMcomponents/prompt/agentic_callback_extra.go58// ConvAgenticCallbackOutput converts the callback output to the agentic prompt callback output.COMMENT
MEDIUMcomponents/model/option.go54 // Options only available for agentic model.COMMENT
MEDIUMcomponents/model/option.go56 // AgenticToolChoice controls how the agentic model calls tools.COMMENT
MEDIUMcomponents/model/option.go166// WithAgenticToolChoice is the option to set tool choice for the agentic model.COMMENT
MEDIUMcomponents/model/interface.go106// *schema.AgenticMessage. Unlike ToolCallingChatModel, agentic models do NOTCOMMENT
MEDIUMcomponents/model/agentic_callback_extra.go24// AgenticConfig is the config for the agentic model.COMMENT
MEDIUMcomponents/model/agentic_callback_extra.go30 // Temperature is the temperature, which controls the randomness of the agentic model.COMMENT
MEDIUMcomponents/model/agentic_callback_extra.go32 // TopP is the top p, which controls the diversity of the agentic model.COMMENT
MEDIUMcomponents/model/agentic_callback_extra.go36// AgenticCallbackInput is the input for the agentic model callback.COMMENT
MEDIUMcomponents/model/agentic_callback_extra.go38 // Messages is the agentic messages to be sent to the agentic model.COMMENT
MEDIUMcomponents/model/agentic_callback_extra.go40 // Tools is the tools to be used in the agentic model.COMMENT
MEDIUMcomponents/model/agentic_callback_extra.go42 // Config is the config for the agentic model.COMMENT
MEDIUMcomponents/model/agentic_callback_extra.go48// AgenticCallbackOutput is the output for the agentic model callback.COMMENT
MEDIUMcomponents/model/agentic_callback_extra.go50 // Message is the agentic message generated by the agentic model.COMMENT
MEDIUMcomponents/model/agentic_callback_extra.go52 // Config is the config for the agentic model.COMMENT
MEDIUMcomponents/model/agentic_callback_extra.go60// ConvAgenticCallbackInput converts the callback input to the agentic model callback input.COMMENT
MEDIUMcomponents/model/agentic_callback_extra.go78// ConvAgenticCallbackOutput converts the callback output to the agentic model callback output.COMMENT
Structural Annotation Overuse7 hits · 13 pts
SeverityFileLineSnippetContext
LOWadk/runctx.go120// NOTE: This method parallels agentEventWrapper.consumeStream in utils.go. The twoCOMMENT
LOWadk/turn_loop_test.go5956 // Step 1: Push item A (no preempt). Wait for agent to start.COMMENT
LOWadk/turn_loop_test.go5960 // Step 2: Push item B with preempt. This cancels the first turn.COMMENT
LOWadk/turn_loop_test.go5966 // Step 3: Push item C with preempt. This is the scenario that triggersCOMMENT
LOWadk/middlewares/reduction/internal/clear_tool_result.go118 // Step 1: Calculate total tool result tokensCOMMENT
LOWadk/middlewares/reduction/internal/clear_tool_result.go131 // Step 2: Calculate the index from which to protect recent messagesCOMMENT
LOWadk/middlewares/reduction/internal/clear_tool_result.go147 // Step 3: Clear tool results outside the protected range (before recentStartIdx)COMMENT
Verbosity Indicators6 hits · 11 pts
SeverityFileLineSnippetContext
LOWadk/turn_loop_test.go5956 // Step 1: Push item A (no preempt). Wait for agent to start.COMMENT
LOWadk/turn_loop_test.go5960 // Step 2: Push item B with preempt. This cancels the first turn.COMMENT
LOWadk/turn_loop_test.go5966 // Step 3: Push item C with preempt. This is the scenario that triggersCOMMENT
LOWadk/middlewares/reduction/internal/clear_tool_result.go118 // Step 1: Calculate total tool result tokensCOMMENT
LOWadk/middlewares/reduction/internal/clear_tool_result.go131 // Step 2: Calculate the index from which to protect recent messagesCOMMENT
LOWadk/middlewares/reduction/internal/clear_tool_result.go147 // Step 3: Clear tool results outside the protected range (before recentStartIdx)COMMENT
Example Usage Blocks5 hits · 8 pts
SeverityFileLineSnippetContext
LOWadk/middlewares/dynamictool/toolsearch/toolsearch.go111// Example usage:COMMENT
LOWadk/middlewares/skill/skill.go250// Example usage:COMMENT
LOWadk/middlewares/filesystem/filesystem.go386// Example usage:COMMENT
LOWflow/retriever/parent/parent.go57// Example usage:COMMENT
LOWflow/indexer/parent/parent.go71// Example usage:COMMENT
AI Slop Vocabulary1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMcompose/interrupt.go144// This function is robust and can handle several types of errors from sub-processes:COMMENT
Decorative Section Separators1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMadk/turn_loop.go185// └────────abortPlanningTurn─────────────────────────────┘COMMENT